先贴上T了的代码:
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
#include<sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <string>
#include<string.h>
#define inf 0x3f3f3f
#define sf scanf
#define pf printf
using namespace std;
typedef long long ll;
typedef pair<int ,int > P;
ll gcd(ll a,ll b) { return b>0?gcd(b,a%b):a;}
ll lcm(ll a,ll b){ return a*b/gcd(a,b);}
//head
#define maxn 20000
int T;
string s;
//将字符串转换为数字
ll zs(string s){
ll res;
stringstream ss;
ss<<s;
ss>>res;
return res;
}
ll Max,Case=0,ans;
int main(){
cin>>T;
while(T--){
Case++;
Max=-inf;
cin>>s;
int len=s.length();
for(int i=1;i<len;i++){
for(int j=1;i+j<len;j++){
for(int k=1;i+j+k<len;k++){
for(int p=1;i+j+k+p<len;p++){
// cout<<i<<" "<<j<<" "<<k<<" "<<p<<" ";
if(i+j+k+p>=len) continue;
ll t1=zs(s.substr(0,i));
ll t2=zs(s.substr(i,j));
ll t3=zs(s.substr(i+j,k));
ll t4=zs(s.substr(i+j+k,p));
ll t5=zs(s.substr(i+j+k+p));
// cout<<t1<<" "<<t2<<" "<<t3<<" "<<t4<<" "<<t5<<endl;
ans=t1+t2-t3*t4/t5;
Max=max(ans,Max);
}
}
}
}
cout<<"Case #"<<Case<<": "<<Max<<endl;
}
return 0;
}
贴上标程:
分四种情况讨论即可,也就是让加的数尽可能大优化。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <map>
using namespace std;
#define LL long long
const int N = 20+7;
char A[N];
int len;
LL get( int l, int r ) {
LL ans = 0;
for( int i = l; i <= r; ++i ) {
ans *= 10;
ans += A[i] - '0';
}
if( ans < 0 ) {
cout<<l<<" "<<r<<endl;
}
return ans;
}
LL solve1() {
int lenA = 1, lenB = len-4, lenC = 1, lenD = 1, lenE = 1;
LL a = get( 0, 0 );
LL b = get( 1, lenB );
LL c = get( len-3, len-3 );
LL d = get( len-2, len-2 );
LL e = get( len-1, len-1 );
// printf( "%d %d %d %d %d\n", a, b, c, d, e );
LL ans1 = a+b-c*d/e;
// cout<<ans1<<endl;
lenA = len-4, lenB = 1, lenC = 1, lenD = 1, lenE = 1;
a = get( 0, lenA-1 );
b = get( lenA, lenA+lenB-1 );
c = get( len-3, len-3 );
d = get( len-2, len-2 );
e = get( len-1, len-1 );
// printf( "%d %d %d %d %d\n", a, b, c, d, e );
LL ans2 = a+b-c*d/e;
// cout<<ans2<<endl;
return max( ans1, ans2 );
}
LL solve2() {
if( len == 5 ) {
return -0x3fffffffffffffff;
}
int lenA = 1, lenB = len-5, lenC = 1, lenD = 1, lenE = 2;
LL a = get( 0, 0 );
LL b = get( 1, lenB );
LL c = get( len-4, len-4 );
LL d = get( len-3, len-3 );
LL e = get( len-2, len-1 );
// printf( "%d %d %d %d %d\n", a, b, c, d, e );
LL ans1 = a+b-c*d/e;
// cout<<ans1<<endl;
lenA = len-5, lenB = 1, lenC = 1, lenD = 1, lenE = 2;
a = get( 0, lenA-1 );
b = get( lenA, lenA );
c = get( len-4, len-4 );
d = get( len-3, len-3 );
e = get( len-2, len-1 );
// printf( "%d %d %d %d %d\n", a, b, c, d, e );
LL ans2 = a+b-c*d/e;
// cout<<ans2<<endl;
return max( ans1, ans2 );
}
int main() {
// freopen( "std.in", "r", stdin );
//
int _;
scanf( "%d", &_ );
int cases = 1;
while( _-- ) {
scanf( "%s", A );
len = strlen( A );
// cout<<len<<endl;
LL ans1 = solve1();
LL ans2 = solve2();
// Case #1: 1
printf( "Case #%d: %lld\n", cases++, max(ans1,ans2) );
}
}