2cm

题目戳这

题意:给你一个由数字组成的字符串,让你分成五份,然后在中间按顺序插入加减乘除这四个符号,然后算出答案,求这个答案的最大值。

思路:暴力枚举减号的位置就行了,就是由减号为一个分界线,前面的字符串分成两部分,一个部分是一个数字,其余的部分组成剩下的数字,后面的让前面两个数字相乘,余下的数字组成最后一个数字。所以就成了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\n",++cas,ans);
59     }
60 
61     return 0;
62 }
View Code

 

posted on 2016-10-29 21:37  2cm  阅读(247)  评论(0编辑  收藏  举报