zoukankan      html  css  js  c++  java
  • Codeforces 552E

    给一个只有加号和乘号的表达式,要求添加一对括号使得最后结果最大。表达式长度5000,乘号最多12个,表达式中数字只有1位。

    左括号一定在乘号右边,右括号一定在乘号左边,因为如果不是这样的话,一定可以调整括号的位置使表达式的值增大。

    于是只要枚举括号的位置然后计算表达式即可。【以上来源懒得自己写了

    做到这道题的时候突然发现自己忘记表达式求值怎么求了

    这个表达式只有括号,加号和乘号

    大概用到了后缀表达式的思想,但不会去真正化成后缀表达式

    建两个栈,一个char类型,一个int类型

    从左到右扫描,

    如果是数,则直接压入int栈中

    如果是'*'或者'(',则将其加入char栈中

    如果是是')',则不断地将符号从char栈中取出来,直到遇到'(',最后在把'('弹出

    每从char中取出一个元素,

    从int栈中取出两个元素,进行相应的操作,然后重新放回int栈中。

    当扫描完整个表达式后,如果char栈中还有符号,

    不断地弹出弹出,操作同上。。

    就这样:)

    #include<bits/stdc++.h>
    #define eps 1e-9
    #define FOR(i,j,k) for(int i=j;i<=k;i++)
    #define MAXN 1005
    #define MAXM 40005
    #define INF 0x3fffffff
    #define PB push_back
    #define MP make_pair
    #define X first
    #define Y second
    #define lc (k<<1)
    #define rc ((k<<1)1)
    using namespace std;
    typedef long long LL;
    LL i,j,k,n,m,x,y,T,ans,big,cas,num,len;
    bool flag;
    
    stack<char> tt;
    stack<LL> an;
    char ss[5005];
    char s[5005];
    
    
    LL calc(LL l,LL r)
    {
        LL i,j;
        while (!tt.empty()) tt.pop();
        LL nn=0;
    
        while (!an.empty()) an.pop();
        for (i=0;i<len;i++)
        {
            if (i==r)
            {
                char c=tt.top();
                while (c!='(')
                {
                    LL u=an.top();an.pop();
                    LL v=an.top();an.pop();
                    if(c=='+') an.push(u+v);
                    else if (c=='*') an.push(u*v);
                    tt.pop();
                    c=tt.top();
                }
                tt.pop();
            }
            
            
            if (s[i]=='*') tt.push(s[i]);else
            if (s[i]=='+')
            {
                while (!tt.empty() && tt.top()=='*')
                {
                    LL u=an.top();an.pop();
                    LL v=an.top();an.pop();
                    an.push(u*v);
                    tt.pop();
                }
                tt.push(s[i]);
            }else
            if (s[i]>='0' && s[i]<='9')
            {
                an.push(s[i]-'0');
            }
            
            if (i==l)
            {
                tt.push('(');
            }
        }
        while (!tt.empty())
        {
            char c=tt.top();
            LL u=an.top();an.pop();
            LL v=an.top();an.pop();
            if(c=='+') an.push(u+v);
            else if (c=='*') an.push(u*v);
            tt.pop();
        }
        
        return an.top();
    }
    
    vector<LL> mul;
    
    int main()
    {
        scanf("%s",s+2);
        s[0]='1';
        s[1]='*';
        len=strlen(s);
        s[len]='*';
        s[len+1]='1';
        s[len+2]=0;
        len=strlen(s);
        //printf("%s
    ",s);
        
        mul.clear();
        for (i=0;i<len;i++)
        {
            if (s[i]=='*') mul.PB(i);
        }
        ans=0;
        for (i=0;i<mul.size();i++)
        {
            for (j=i+1;j<mul.size();j++)
            {
                
                LL tmp=calc(mul[i],mul[j]);
                ans=max(ans,tmp);
            }
        }
        printf("%I64d
    ",ans);
        return 0;
    }
  • 相关阅读:
    fidller 打断点
    随笔
    HTML标签介绍
    补充9.27----9.28
    html5_______9.26
    9.14
    9.13笔记
    9.12笔记
    CSS样式的引用
    html5_______9.10
  • 原文地址:https://www.cnblogs.com/zhyfzy/p/4588270.html
Copyright © 2011-2022 走看看