2018NJUPT 第一场排位赛排位赛F(枚举)

这里写图片描述
这里写图片描述

先贴上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) );
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/81544233