• ZOJ3829---模拟,贪心


      这是2014年ACM亚洲区预赛牡丹江现场赛的一道题,铜牌题,可惜当时一路WA到死。。。

    只有乘法的后缀表达式的特点有两个:(1)数字的数量一定大于‘*’的数量(2)最后一位一定是‘*’;

    数字比*多的话,*怎么排列都无所谓,因为1111即可以看成4个1,也可以看成1111,总可以与‘*’

    结合。所以在模拟之前做以下预处理:(1)把缺少的数字补上(2)把最后一位1与前面的任何‘*’交换

    开始模拟,一个‘*’能被结合,必须前面有大于或者等于2个数字,所以设置一个栈,遇到一个栈,就入

    栈一个数字,遇到一个‘*’,如果栈里面1的个数少于2个,则把‘*’与后面的数字交换,等stack里的数字》=2时;

    出栈一次,模拟到字符串尾即可;

    至于why,只要数字够用即可,所以当遇到‘*’前面的数字不够时,不是插入1,而是将*与后面的1交换。。总之是fuck the dog!。。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <iostream>
    #include <cmath>
    #include <queue>
    #include <stack>
    #define INF 0x3f3f3f3f
    using namespace std;
    const int maxn = 10005;
    typedef long long ll;
    
    int t;
    string ss;
    int len;
    
    
    int main()
    {
        //freopen("in","r",stdin);
        scanf("%d",&t);
        while(t--)
        {
            stack<int> s;
            queue<int> que;
            ss = "";
            cin>>ss;
            len = ss.size();
            int op = 0;
            int sch = 0,snum = 0;
            int pos;
            for(int i = 0; i < len; ++i)
            {
                if(ss[i] == '*') sch++;
                else snum++;
            }
            if(sch >= snum){
                for(int i = 0; i < sch-snum+1; ++i)
                {
                    ss='1'+ss;
                }
                op+=sch-snum+1;
            }
            if(sch > 0&&ss[ss.size() - 1] != '*'){
                for(int i = 0; i < ss.size(); ++i)
                if(ss[i] == '*') {
                        pos = i;break;
                }
                swap(ss[pos],ss[ss.size() - 1]);
                op+=1;
            }
            for(int i = ss.size() - 1; i >= 0; --i)
            {
                if(ss[i] != '*') que.push(i);
            }
            for(int i = 0; i < ss.size(); ++i)
            {
                if(ss[i] == '*')
                {
                    if(s.size() == 1){
                        pos = que.front();//cout<<pos<<endl;
                        swap(ss[i],ss[pos]);
                        que.pop();
                        op++;
                        s.push(1);
                    }
                    else if(s.size() == 0){
                        int pos = que.front();
                        swap(ss[i],ss[pos]);
                        que.pop();
                        pos = que.front();
                        swap(ss[i],ss[pos]);
                        que.pop();
                        op+=2;
                        s.push(1);
                        s.push(1);
                    }
                    else s.pop();
                }
                else{
                    s.push(1);
                }
            }
            printf("%d
    ",op);
        }
    }
  • 相关阅读:
    NPOI操作EXCEL
    几个英文的数学概念
    C#中将鼠标光标变为忙碌状态
    C#使用Linq to Sqlite
    SSM-SpringMVC-25:SpringMVC异常顶级之自定义异常解析器
    SSM-SpringMVC-24:SpringMVC异常高级之自定义异常
    SSM-SpringMVC-23:SpringMVC中初探异常解析器
    SSM-SpringMVC-22:SpringMVC中转发(forward)和重定向(redirect)
    SSM-SpringMVC-21:SpringMVC中处理器方法之返回值Object篇
    jQuery-01:on live bind delegate
  • 原文地址:https://www.cnblogs.com/Norlan/p/4864334.html
Copyright © 2020-2023  润新知