题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5938
题意:给一个不超过20位并且大于2位的数字字符串(只包含1-9)然后找到适当的位置依次放入"+-*/"四个符号,然后求能构成的最大的数;
可以看成是 A+B-C*D/E这种形式,要想让结果最大,那么A+B要尽可能大,C*D/E要尽可能小;
所以C和D只能是一位数,那么C*D的结果就是1位数或者2位数,因此E取3位数时C*D/E一定是0了,但是这不一定是最大的结果, 所以我们可以枚举E为1,2,3位数时的三种情况, 取最大值;
这样就确定了C,D,E和AB的长度;就可以直接求了;
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; typedef long long LL; const int N = 25; const int INF = 0x3f3f3f3f; const double eps = 1e-10; char s[N]; int len; LL solve(int n) { LL Max = 0; for(int i=1; i<=n-1; i++) ///a由i位数构成; { LL a = 0, b = 0; for(int j=0; j<i; j++) a = a*10 + s[j]-'0'; for(int j=i; j<n; j++) b = b*10 + s[j]-'0'; Max = max(Max, a+b); } return Max; } LL Find(int k)/// 表示/号后面有k位数; { if(len-k < 4)///要剩下4位以上才可以; return -INF; LL c, d, e = 0;///求 a + b - c*d/e; for(int i=len-k; i<len; i++) e = e*10 + s[i]-'0'; d = s[len-k-1]-'0'; c = s[len-k-2]-'0'; LL m = solve(len-k-2);///求前面的数能组成的最大的a+b存到m中; return (m-c*d/e); } int main() { int T, t = 1; scanf("%d", &T); while(T --) { scanf("%s", s); len = strlen(s); LL ans = -INF; ans = max(ans, Find(1)); ans = max(ans, Find(2)); ans = max(ans, Find(3)); printf("Case #%d: %I64d ", t++, ans); } return 0; }