题意:给你一个由数字组成的字符串,让你分成五份,然后在中间按顺序插入加减乘除这四个符号,然后算出答案,求这个答案的最大值。
思路:暴力枚举减号的位置就行了,就是由减号为一个分界线,前面的字符串分成两部分,一个部分是一个数字,其余的部分组成剩下的数字,后面的让前面两个数字相乘,余下的数字组成最后一个数字。所以就成了aaa+a-a*a/aaaaaa 或者a+aaa-a*a/aaaa。
P.S.一开始以为只是简单地让前面的所有数字组成加法,然后后面剩下4个数字组成后面部分,也就是aaaaa+a-a*a/a,然而这是错的,反例:123991,这个应该是1+2-3*9/91。然后就想到会不会是看长度,如果是小于8的就是暴力枚举,否则就是按照第一种方法那样得出答案(8这个数字是随便想的),然后还是WA了,最后,看到题解了,说是枚举减号的位置,很好,这回应该可以了,然后枚举完了之后还是WA了,尼玛,最后由同学提醒才看到,答案不应该初始化为0,而是应该初始化为-1e18······,改好之后终于对了······
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 #include<vector> 7 #include<string> 8 #include<queue> 9 #include<map> 10 #include<stack> 11 #include<set> 12 #include<list> 13 #define ll long long 14 #define maxn 100100 15 #define PI acos(-1.0) //圆周率 16 const ll INF = 1e18; 17 using namespace std; 18 int T; 19 char s[50]; 20 int main() 21 { 22 ll cas=0; 23 scanf("%d",&T); 24 while(T--) 25 { 26 scanf("%s",s); 27 int len=strlen(s); 28 29 ll big=0; 30 ll ans=-INF; 31 for(int i=2;i<len-2;i++) 32 { 33 ll l=0,r=0; 34 big=0; 35 ll f=1; 36 for(int j=i-1;j>=1;j--) r+=(s[j]-'0')*f,f*=10; f=1; 37 for(int j=i-2;j>=0;j--) l+=(s[j]-'0')*f,f*=10; 38 39 if(l>r) big=l+(s[i-1]-'0'); 40 else big=r+(s[0]-'0'); 41 42 //cout<<big<<endl; 43 44 ll c=s[i]-'0'; 45 ll d=s[i+1]-'0'; 46 47 f=1; 48 ll e=0; 49 for(int j=len-1;j>=i+2;j--) e+=(s[j]-'0')*f,f*=10; 50 51 //cout<<c<<" "<<d<<" "<<e<<endl; 52 53 big-=c*d/e; 54 55 ans=ans>big?ans:big; 56 } 57 58 printf("Case #%lld: %lld ",++cas,ans); 59 } 60 61 return 0; 62 }