美文网首页
算式转移(hard)

算式转移(hard)

作者: 微糖去冰_ | 来源:发表于2019-08-28 15:41 被阅读0次

题目描述:
给出一个仅包含加减乘除四种运算符的算式(不含括号),如1+2*3/4,在保持运算符顺序不变的情况下,现在你可以进行若干次如下操作:如果交换相邻的两个数,表达式值不变,那么你就可以交换这两个数。
现在你可以进行任意次操作,使得算式的数字序列字典序最小,然后输出结果,数字之间的字典序定义为若a<b则a的字典序小于b。

输入
第一行包含一个整数n,表示算式的长度,即包含n个数字和n-1个运算符。(1≤n≤100000)。
第二行包含一个含有n个非0整数和n-1个运算符的算式,整数与运算符用空格隔开,运算符包括“+,-,*,/”,整数的绝对值不超过1000。

输出
按要求输出字典序最小的表达式,数字与符号之间用空格隔开。

样例输入
6
3 + 2 + 1 + -4 * -5 + 1
样例输出
1 + 2 + 3 + -5 * -4 + 1

int Partition(vector<int>& nums, int left, int right) {
    int pivot = nums[left], l = left + 1, r = right;
    while (l <= r) {
        if (nums[l] > pivot && nums[r] < pivot)
            swap(nums[l], nums[r]);
        if (nums[l] <= pivot) l++;
        if (nums[r] >= pivot) r--;
    }
    swap(nums[left], nums[r]);
    return r;
}
 
void QuickSort(vector<int> &nums, int lo, int hi) {
    if (hi <= lo) return;
    int seg = Partition(nums, lo, hi);
    QuickSort(nums, lo, seg - 1);
    QuickSort(nums, seg + 1, hi);
}
 
int main(){
    int n; cin>>n;
    vector<int> nums(n, 0);
    vector<char> ops(n, '+');
    for(int i=0; i<n-1; ++i){
        cin >> nums[i];
        cin >> ops[i+1];
    }
    cin >> nums[n-1];
 
    int l=0, r=0;
    while(r<n){
        while(r<n && ops[r] == ops[l]) ++r;
        --r;
        if(ops[l] == '+' || ops[l] == '-'){
            if(r<n-1 && (ops[r+1]=='*' || ops[r+1]=='/'))
                QuickSort(nums, l, r-1);
            else
                QuickSort(nums, l, r);
             
        }
        else if(ops[l] == '*'){
            if(l>0 && (ops[l-1]=='+' || ops[l-1]=='-'))
                QuickSort(nums, l-1, r);
            else
                QuickSort(nums, l, r);
        }
        else if(ops[l] == '/'){
            QuickSort(nums, l, r);
        }
        ++r; l=r;
    }
     
    string ans = to_string(nums[0]);
    for(int i=1; i<n; ++i){
        ans.push_back(' ');
        ans.push_back(ops[i]);
        ans.push_back(' ');
        ans += to_string(nums[i]);
    }
    cout<<ans<<endl;
    return 0;
} 

相关文章

  • 算式转移(hard)

    题目描述:给出一个仅包含加减乘除四种运算符的算式(不含括号),如1+2*3/4,在保持运算符顺序不变的情况下,现在...

  • 算式

    结婚典礼上面,一个司仪问两位新人:“以后财政大权谁来掌握?”两人同时说自己。 司仪皱了皱眉说:“那我出道题考考你们...

  • 【终极算式】

    水生木木生火火生土土生金金生水 土克水水克火火克金金克木木克土 阳顺阴逆中庸平衡阴阳五行既是弹性的定律也是万能的应用 -

  • 爱情算式

    中年男人问妻子:过了半辈子,你认为什么是爱情。 妻子想了想说:爱情就是你给我200元钱,我买了二斤排骨,买了些青菜...

  • 生活算式

    1. 生活算式与构成因子生活其实就是由某几项大因素,若干小因素所掌控着。不管你对这些大小因素控制得如何,生活...

  • 胖博士奥数课堂746期:(四年级)找规律

    胖博士今天分享的题目如下: 观察以下的一串算式: 第1个算式:1+2 第2个算式:3+4+5 第3个算式:6+7+...

  • 【学情】口算卡片

    关于“口算卡片”,一定要让孩子读算式说得数,建立“算式”和“得数”之间对应的关系。 孩子们现在已经做了110张算式...

  • 【学情】口算卡片

    关于“口算卡片”,一定要让孩子读算式说得数,建立“算式”和“得数”之间对应的关系。 孩子们现在已经做了110张算式...

  • 卡卡大班小组活动—9的加减法

    在进行9的加减前,先让孩子通过实物分解对后面抽象的算式有具体概念。 这用加法算式还是减法算式呢?看看我们...

  • 19/09/2017

    Work hard,play hard,study hard, love hard.一个小姐姐跟我这么说。她说后两...

网友评论

      本文标题:算式转移(hard)

      本文链接:https://www.haomeiwen.com/subject/aofmectx.html