题意:两个人A和B在打牌,只有题目给出的几种牌能出若A第一次出牌B压不住或者A一次就把牌出完了,那么A赢,输出Yes,否则若A牌没出完而且被B压住了,那么A输,输出No。
解法:知道规则,看清题目,搞清有哪些Trick,就可以直接模拟搞了。详见代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <vector> #include <queue> using namespace std; #define N 100102 #define M 22 char s1[24],s2[24]; int A[24],B[24]; int cnt1[20],cnt2[20]; int main() { int n,i,j; int n1,n2; scanf("%d",&n); while(n--) { priority_queue<int> Single,Pair,Tri,Four,Nuke; priority_queue<int> Single2,Pair2,Tri2,Four2,Nuke2; scanf("%s",s1); scanf("%s",s2); n1 = strlen(s1); n2 = strlen(s2); for(i=0;i<n1;i++) { if(s1[i] >= ‘3‘ && s1[i] <= ‘9‘) A[i] = s1[i]-‘0‘; else if(s1[i] == ‘T‘) A[i] = 10; else if(s1[i] == ‘J‘) A[i] = 11; else if(s1[i] == ‘Q‘) A[i] = 12; else if(s1[i] == ‘K‘) A[i] = 13; else if(s1[i] == ‘A‘) A[i] = 14; else if(s1[i] == ‘2‘) A[i] = 15; else if(s1[i] == ‘X‘) A[i] = 16; else if(s1[i] == ‘Y‘) A[i] = 17; } for(i=0;i<n2;i++) { if(s2[i] >= ‘3‘ && s2[i] <= ‘9‘) B[i] = s2[i]-‘0‘; else if(s2[i] == ‘T‘) B[i] = 10; else if(s2[i] == ‘J‘) B[i] = 11; else if(s2[i] == ‘Q‘) B[i] = 12; else if(s2[i] == ‘K‘) B[i] = 13; else if(s2[i] == ‘A‘) B[i] = 14; else if(s2[i] == ‘2‘) B[i] = 15; else if(s2[i] == ‘X‘) B[i] = 16; else if(s2[i] == ‘Y‘) B[i] = 17; } sort(A,A+n1); sort(B,B+n2); memset(cnt1,0,sizeof(cnt1)); memset(cnt2,0,sizeof(cnt2)); for(i=0;i<n1;i++) //计算A各种牌的个数 cnt1[A[i]]++; for(i=0;i<n2;i++) //计算B各种牌的个数 cnt2[B[i]]++; for(i=3;i<=15;i++) { if(cnt1[i] == 4) //出现四个,可以做四个出,可以做三个出,也可以做两个或一个出 Four.push(i),Tri.push(i),Pair.push(i),Single.push(i); else if(cnt1[i] == 3) Tri.push(i),Pair.push(i),Single.push(i); else if(cnt1[i] == 2) Pair.push(i),Single.push(i); else if(cnt1[i] == 1) Single.push(i); } for(i=3;i<=15;i++) { if(cnt2[i] == 4) Four2.push(i),Tri2.push(i),Pair2.push(i),Single2.push(i); else if(cnt2[i] == 3) Tri2.push(i),Pair2.push(i),Single2.push(i); else if(cnt2[i] == 2) Pair2.push(i),Single2.push(i); else if(cnt2[i] == 1) Single2.push(i); } if(cnt1[16]) //有王,可以做单个出 Nuke.push(16),Single.push(16); if(cnt1[17]) Nuke.push(17),Single.push(17); if(cnt2[16]) Nuke2.push(16),Single2.push(16); if(cnt2[17]) Nuke2.push(17),Single2.push(17); if(Nuke.size() >= 2) //双王,直接赢 { puts("Yes"); continue; } //-------------------------------下面判断能否一次出完 if(n1 == 1) { puts("Yes"); continue; } if(n1 == 2) { if(A[0] == A[1]) { puts("Yes"); continue; } } if(n1 == 3) { if(A[0] == A[1] && A[1] == A[2]) { puts("Yes"); continue; } } if(n1 == 4) { if(A[0] == A[1] && A[1] == A[2] && A[2] == A[3]) { puts("Yes"); continue; } if(A[0] != A[1] && A[1] == A[2] && A[2] == A[3]) { puts("Yes"); continue; } if(A[2] != A[3] && A[0] == A[1] && A[1] == A[2]) { puts("Yes"); continue; } } if(n1 == 5) { if(A[0] == A[1] && A[1] != A[2] && A[2] == A[3] && A[3] == A[4]) { puts("Yes"); continue; } if(A[3] == A[4] && A[2] != A[3] && A[0] == A[1] && A[1] == A[2]) { puts("Yes"); continue; } } if(n1 == 6) { int tag = 0; for(i=0;i<=2;i++) { if(A[i] == A[i+1] && A[i+1] == A[i+2] && A[i+2] == A[i+3]) { tag = 1; break; } } if(tag) { puts("Yes"); continue; } } //-----------------------------如果不能一次出完 if(Nuke2.size() >= 2) //对方有双王,必输 { puts("No"); continue; } if(!Nuke.empty() && Nuke2.empty()) //A有王,B没王 { puts("Yes"); continue; } if(!Nuke.empty() && !Nuke2.empty()) //都有王,看谁的大,如果A小,则不选择出王,继续 { if(Nuke.top() > Nuke2.top()) { puts("Yes"); continue; } } if(Four.empty() && !Four2.empty()) //炸弹,如果不能一次出完又没炸弹,那么必会被炸,输 { puts("No"); continue; } if(!Four.empty() && Four2.empty()) //有炸弹出炸弹 { puts("Yes"); continue; } if(!Four.empty() && !Four2.empty()) //都有炸弹,A的如果小,因为不能一次出完,必输 { if(Four.top() >= Four2.top()) { puts("Yes"); continue; } else { puts("No"); continue; } } if(!Tri.empty() && Tri2.empty()) //三个的情况 { puts("Yes"); continue; } if(!Tri.empty() && !Tri2.empty()) { if(Tri.top() >= Tri2.top()) { puts("Yes"); continue; } else if(n1 >= 4 && n2 <= 3) //A有的带,B没得带 { puts("Yes"); continue; } } if(!Pair.empty() && Pair2.empty()) //对子 { puts("Yes"); continue; } if(!Pair.empty() && !Pair2.empty()) { if(Pair.top() >= Pair2.top()) { puts("Yes"); continue; } } if(Single.empty() && !Single2.empty()) //单个牌 { puts("No"); continue; } if(!Single.empty() && Single2.empty()) { puts("Yes"); continue; } if(!Single.empty() && !Single2.empty()) { if(Single.top() >= Single2.top()) { puts("Yes"); continue; } } puts("No"); //如果以上都不满足,那么A输了,gg。 } return 0; }
HDU 4930 Fighting the Landlords --多Trick,较复杂模拟,布布扣,bubuko.com
时间: 2024-08-21 23:05:15