題目描述
牌隻有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
解題思路
本題看懂題目後其實很簡單,無非就是判斷自己的牌能否壓過對面,分兩種情況,如果出牌數小于5,則隻要存在大于對方的牌,且該牌數目大于等于對方的牌數即可,如果出牌數等于5,則需要存在大于對方首張大小的牌,且從該張牌開始,連着5張都要至少有一張。這裡有個很常用的程式設計技巧,就是用一個數組來存儲各個牌的數目,隻要掌握該技巧,解此題so easy,貼出代碼供大家參考。
#include<iostream>
using namespace std;
int main(){
string a,b;
cin>>a>>b;
int lenb=b.length();
int num[10];
bool win=false;
for(int i=0;i<10;i++){
num[i]=0;
}
for(int i=0;i<a.length();i++){ //統計手中牌的情況,存至num數組
num[a.at(i)-'0']++;
}
if(lenb<5){
for(int i=b.at(0)-'0'+1;i<10;i++){
if(num[i]>=lenb){
win=true;
}
}
}else{
for(int i=b.at(0)-'0'+1;i<6;i++){
if(num[i]!=0 && num[i+1]!=0 && num[i+2]!=0
&& num[i+3]!=0 && num[i+4]!=0){
win=true;
}
}
}
if(win){
cout<<"YES";
}else{
cout<<"NO";
}
}
總結
隻用了一個技巧,就是将牌的個數存到一個num數組,差不多問題就解決了。