http://codeforces.com/problemset/problem/39/A
根据题意,输进来的都是一个常数乘上一个c++ (c是题目给的数),我们可以将其视为一个单元,许多个单元之间用加号或者减号连接,每一个单元的计算先后顺序都是任意的,求最大结果。
因为都是c++或者是++c,那么肯定是让减号开头的单元也就是常数是负数的先算,然后再算正的。排个序就可以了。
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ll long long struct node{ int x; int f; }; bool cp(node x,node y) { if(x.x!=y.x)return x.x<y.x; if(x.x<0)return x.f<y.f; else return x.f>y.f; } int main() { int a; node p[11111]; char s[11111]; cin>>a>>s; int l=strlen(s); int js=0; for(int i=0;i<l;i++) { if(s[i]!='a')continue; if(i==0) { p[js].f=0; p[js++].x=1; } else { if(s[i-1]=='-') { p[js].f=0; p[js++].x=-1; } else if(s[i-1]=='*') { int zz=i-2; int da=0; int ten=1; while(s[zz]>='0'&&s[zz]<='9'&&zz>=0) { da=da+ten*(s[zz]-'0'); ten*=10; zz--; } if(zz==-1) { p[js].f=0; p[js++].x=da; } else if(s[zz]=='+') { p[js].f=0; p[js++].x=da; }else { p[js].f=0; p[js++].x=-da; } } else if(s[i-1]=='+') { char ss=s[i-2]; if(i-2==0) { p[js].f=1; p[js++].x=1; continue; } char sss=s[i-3]; if(ss=='+'&&sss=='+'&&i-3==0) { p[js].f=1; p[js++].x=1; } else if(ss=='+'&&sss=='+'&&s[i-3-1]=='a') { if(p[js-1].f==0) p[js].f=0,p[js++].x=1; else p[js].f=1,p[js++].x=1; } else if(ss=='+'&&sss=='+'&&s[i-3-1]=='+') { p[js].f=1; p[js++].x=1; } else if(ss=='+'&&sss=='-') { p[js].f=1; p[js++].x=-1; } else if(ss=='+'&&sss=='*') { int zz=i-4; int da=0; int ten=1; while(s[zz]>='0'&&s[zz]<='9'&&zz>=0) { da=da+ten*(s[zz]-'0'); ten*=10; zz--; } if(zz==-1) { p[js].f=1; p[js++].x=da; } else if(s[zz]=='+') { p[js].f=1; p[js++].x=da; }else { p[js].f=1; p[js++].x=-da; } } else { p[js].f=0; p[js++].x=1; } } } } sort(p,p+js,cp); long long ans=0; int a1=a; for(int i=0;i<js;i++) { if(p[i].f==1) { a++; ans+=p[i].x*a; } else{ ans+=p[i].x*a; a++; } } long long ans1=0; for(int i=js-1;i>=0;i--) { if(p[i].f==1) { a1++; ans1+=p[i].x*a1; } else{ ans1+=p[i].x*a1; a1++; } } //for(int i=0;i<js;i++) //cout<<p[i].f<<" "<<p[i].x<<endl; //if(max(ans,ans1)==107216897) //cout<<max(ans,ans1)+1<<endl; cout<<max(ans,ans1)<<endl; //107216897 //cin>>a; return 0; }