Number Game [ZOJ 3180]

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3221

View Code
//逆推
const int MM = 1111111;
#define debug puts("wrong")
//typedef __int64 int64;
const double lep=1e-10;
int N,M, n,m;
map<vector<int>,bool>mp;
vector<int>st;
vector<int>en;

void get_data() {
    int i,j,k,a;
    st.clear();
    for(i=0;i<3;i++) {
        scanf("%d",&a);
        st.push_back(a);
    }
    en.clear();
    for(i=0;i<3;i++) {
        scanf("%d",&a);
        en.push_back(a);
    }
    sort(st.begin(),st.end());
    sort(en.begin(),en.end());
}

bool ok() {
    vector<int>tmp;
    tmp=en; tmp[2]=tmp[0]+tmp[1]-1;
    sort(tmp.begin(),tmp.end());
    if(mp[tmp]) return true;
    
    tmp=en; tmp[1]=tmp[0]+tmp[2]-1;
    sort(tmp.begin(),tmp.end());
    if(mp[tmp]) return true;
    
    tmp=en; tmp[0]=tmp[2]+tmp[1]-1;
    sort(tmp.begin(),tmp.end());
    if(mp[tmp]) return true;
    else return false;
}

void solve() {
    int i,j,k;
    if(st==en) { puts("Yes");return; }
    if(st[0]+st[1]!=st[2]+1) { puts("No");return; }
    
    mp.clear();
    while(1) {
        mp[st]=true;
        st[2]=st[1]-st[0]+1;
        sort(st.begin(),st.end());
        if(mp[st]) break;
    }
    if(ok()) puts("Yes");
    else puts("No");
}

int main() {
    int ca; scanf("%d",&ca);
    while(ca--) get_data(),solve();
    return 0;
}
原文地址:https://www.cnblogs.com/zhang1107/p/3065322.html