ZOJ 3654 Letty's Math Classシミュレーション難易度:0

2151 ワード

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4844
中かっこと正の整数、+,-,結果はlonglongの範囲内の数式と二つの代替解答を含めてあげます.
答えの中に9があれば、一番目は9がAを選びます.そうでなければBを選びます.
もし最初が正解なら、Bを出力します.さもなければ、Aを出力します.
#include <cstdio>

#include <iostream>

#include <cstring>

#include <cctype>

#define clr(x,y) memset(x, y, sizeof x)

#include <cmath>

using namespace std;

const int maxn=2e3+3;

typedef long long ll;

char maz[maxn];



long long read(int& head){

    //printf("read start from %d ",head);

    long long ans=0;

    while(isalnum(maz[head])){

        ans*=10;

        ans+=maz[head]-'0';

        head++;

    }

   // printf("end at %d ans = %lld
",head,ans); return ans; } typedef pair<long long ,int > p; p calc(int st){ long long ans=0; int cnt=1,ind =st; for(;maz[ind]!=0&&maz[ind]!=']';){ if(maz[ind]=='-'){ cnt=-1; ind ++; //printf("calc ind %d cnt -1
",ind); } else if(maz[ind]=='+'){ ind++; } else if(isalnum(maz[ind])){ ans+=cnt*read(ind); cnt=1; //printf("calc ind %d cnt 1 ans%lld
",ind,ans); } else if(maz[ind]=='['){ ind++; p tmp=calc(ind); ans+=cnt*tmp.first; ind=tmp.second+1; cnt=1; } } //printf("calc start at %d end at %d ans = %lld
",st,ind,ans); return p(ans,ind); } int main(){ //freopen("input.txt","r",stdin); while(scanf("%s",maz)==1){ long long a,b; scanf("%lld%lld",&a,&b); if(a==9){ puts("A"); continue; } else if(b==9){ puts("B"); continue; } long long ans=calc(0).first; if(ans==a){ puts("B"); } else puts("A"); } return 0; }