https://www.nowcoder.com/practice/82442ee76977479e8ab4b88dfadfca9f?tpId=67&tqId=29640&tPage=0&ru=/kaoyan/retest/1005&qru=/ta/bupt-kaoyan/question-ranking
题目描述
牌只有1到9,手里拿着已经排好序的牌a,对方出牌b,用程序判断手中牌是否能够压过对方出牌。 规则:出牌牌型有5种 [1]一张 如4 则5...9可压过 [2]两张 如44 则55,66,77,...,99可压过 [3]三张 如444 规则如[2] [4]四张 如4444 规则如[2] [5]五张 牌型只有12345 23456 34567 45678 56789五个,后面的比前面的均大。
输入描述:
输入有多组数据。
每组输入两个字符串(字符串大小不超过100)a,b。a字符串代表手中牌,b字符串代表处的牌。
输出描述:
压过输出YES 否则NO。
示例1
输入
12233445566677
33
输出
YES
此题1-4可以归为一类,统计好每一种手牌的个数查找;5类只有5种情况逐个排除
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<string.h> using namespace std; int main() { string str,chr; str.resize(100); chr.resize(100); while(scanf("%s",&str[0])!=EOF) { scanf("%s",&chr[0]); int tempstr[100],tempchr[100],donser[100],i=0,j=0,OK=0; while(str[i]>‘0‘&&str[i]<=‘9‘) //手牌转换 { tempstr[i]=str[i]-‘0‘; i++; } int sizeStr=i; while(chr[j]>‘0‘&&chr[j]<=‘9‘) //出牌转换 { tempchr[j]=chr[j]-‘0‘; j++; } int sizeChr=j; for(int k=sizeStr;k<100;k++) //初始化 tempstr[k]=-1; for(int k=sizeChr;k<=5;k++) tempchr[k]=-1; for(int k=1;k<=9;k++) donser[k]=0; while(i--) //手牌计数 { donser[tempstr[i]]++; } if(sizeChr<=4) { for(int i=tempchr[0]+1;i<=9;i++) { if(donser[i]>=sizeChr) OK=1; } } else if(sizeChr==5) { for(int i=tempchr[0]+1;i<=5;i++) { int num=0; for(int j=0;j<=4;j++) { if(donser[i+j]>0) num++; } if(num==5) OK=1; } } if(OK) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }