NC54658. 俏兔子大战傻贼鹰-Hard Version
描述
输入描述
输入有多组数据,每组数据第一行是N表示这一局傻贼鹰对你询问了N次。
第二行是一个大写字母(T:表示筒(饼),S:表示索(条)W,表示万)用来表示定缺牌。
接下来N行,每行一个字符串用来表示询问是否能胡的14张牌的信息。
比如:1W1W2W2W1T1T3T3T5T5T6T6T9T9T
表示:一万一万二万二万一筒一筒三筒三筒五筒五筒六筒六筒九筒九筒
输出描述
对于傻贼鹰的每一次询问,如果能胡牌输出Yes,不能胡牌输出No。
示例1
输入:
5 S 1W1W2W2W1T1T3T3T5T5T6T6T9T9T 1W1W2W2W1T1T3T3T5T5T6T6T9S9S 8T9T1W3W4W5T8T2W8T9T5T5T5W6W 1W2W2W1W3W3W3W9S1W1W2W2W3W9S 3W3W3W3W4W5W6W6W6W7W8W9W9W9W 1 T 1W3W1S1S2S1W2W1W3W2S3S3S2W1W
输出:
Yes No Yes No Yes Yes
C++14(g++5.4) 解法, 执行用时: 25ms, 内存消耗: 528K, 提交时间: 2019-11-25 20:24:21
#include<bits/stdc++.h> using namespace std; int num[15][15]={0}; int main() { int q; while(cin>>q) { getchar(); char ch; cin>>ch; while(q--) { int flag=1; string str; cin>>str; char op; for(int i=0;i<str.size();i+=2) { if(str[i+1]==ch) { flag=0;break; } else if(str[i+1]=='T') op=1; else if(str[i+1]=='S') op=2; else op=3; num[str[i]-'0'][op]++; } int sum1=0,sum2=0; for(int i=1;i<=9;i++) { for(int j=1;j<=3;j++) { if(i<=7) { while(num[i][j]&&num[i+1][j]&&num[i+2][j]) { num[i][j]--; num[i+1][j]--; num[i+2][j]--; sum1++; } } if(num[i][j]==3) sum1++; if(num[i][j]==2) sum2++; num[i][j]=0; } } if(flag&&(sum1==4&&sum2==1||sum2==7)) cout<<"Yes\n"; else cout<<"No\n"; } } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 352K, 提交时间: 2019-11-17 17:10:50
#include<cstdio> #include<cstring> char op,s[52]; int num[10][5]; int main(){ int t,lens; while(~scanf("%d",&t)){ getchar(); scanf("%c",&op); while(t--){ scanf("%s",s); lens=strlen(s); bool flag=true; for(int i=0;i<lens;i+=2){ int op1=s[i]-'0',op2; if(s[i+1]=='S') op2=0; else if(s[i+1]=='T') op2=1; else op2=2; num[op1][op2]++; if(s[i+1]==op){ flag=false; break; } } int num1=0,num2=0; for(int i=1;i<=9;i++) for(int j=0;j<3;j++){ if(i<=7){ while(num[i][j]&&num[i+1][j]&&num[i+2][j]){ num[i][j]--; num[i+1][j]--; num[i+2][j]--; num1++; } } if(num[i][j]>=3) num1++; if(num[i][j]==2) num2++; num[i][j]=0; } if(flag&&((num1==4&&num2==1)||num2==7)) printf("Yes\n"); else printf("No\n"); } } return 0; }