Four Operations---hdu5938(暴力)

 题目链接: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;
}
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/6011209.html