一、题目
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.
二、分析
题目给一串数,在这一串数中插空按顺序加入±/四个符号,求最大值。
那么也就是把输入的一串数分割成这样a+b-cd/e
分析一下,要让结果最大,分成两部分a+b和cd/e
a+b这一部分肯定是a或b是个位数,而另一半是一个多位数,这样结果最大
-cd/e这部分要让cd/e最小,那么cd要最小,那么这两个一定是个位数,e要最大,这个可能是多位数。
那么只需要枚举e的大小即可,e从个位数开始枚举。
最后这道题有个坑,ans初始化应该为负无穷,因为结果可能会减出负数,因为这个问题WA了好多次…
#include<iostream>
#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<<s.substr(1,i-4)<<"+"<<s.substr(i-3,1)<<"-"<< s.substr(i-2,1)<<"*"<< s.substr(i-1,1)<<"/"<< s.substr(i)<<endl;
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<<s.substr(1,1)<<"+"<<s.substr(2,i-4)<<"-"<< s.substr(i-2,1)<<"*"<< s.substr(i-1,1)<<"/"<< s.substr(i)<<endl;
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);
}
}