Four Operations

一、题目

Little Ruins is a studious boy, recently he learned the four operations!

Now he want to use four operations to generate a number, he takes a string which only contains digits ‘1’ - ‘9’, and split it into
5
5 intervals and add the four operations ‘+’, ‘-’, ‘*’ and ‘/’ in order, then calculate the result(/ used as integer division).

Now please help him to get the largest result.Four Operations_第1张图片
Four Operations_第2张图片

二、分析

题目给一串数,在这一串数中插空按顺序加入±/四个符号,求最大值。
那么也就是把输入的一串数分割成这样a+b-c
d/e

分析一下,要让结果最大,分成两部分a+b和cd/e
a+b这一部分肯定是a或b是个位数,而另一半是一个多位数,这样结果最大
-c
d/e这部分要让cd/e最小,那么cd要最小,那么这两个一定是个位数,e要最大,这个可能是多位数。
那么只需要枚举e的大小即可,e从个位数开始枚举。

最后这道题有个坑,ans初始化应该为负无穷,因为结果可能会减出负数,因为这个问题WA了好多次…

#include
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
long long trans(string s)//字符串转数字(string转int)
{
    long long ans=0;
    for(long long i=0;i<s.size();i++)
    {
        ans=ans*10+s[i]-'0';
    }
    return ans;
}
signed main()
{
    int T;cin>>T;
    for(int ca=1;ca<=T;ca++)
    {
        string s;
        cin>>s;
        s=" "+s;
        int ans=-INF;//注意这里的初始化
        int i=5;
        for(int i=s.size()-1;i>=5;i--)
        {
            // cout<
            int cnt=trans(s.substr(1,i-4))+trans(s.substr(i-3,1))-trans(s.substr(i-2,1))*trans(s.substr(i-1,1))/trans(s.substr(i));
            ans=max(ans,cnt);
            // cout<
            cnt=trans(s.substr(1,1))+trans(s.substr(2,i-4))-trans(s.substr(i-2,1))*trans(s.substr(i-1,1))/trans(s.substr(i));
            ans=max(ans,cnt);
        }
        printf("Case #%lld: %lld\n",ca,ans);
    }
}

你可能感兴趣的:(c++,开发语言,数据结构,算法,c语言)