链接
http://ac.jobdu.com/problem.php?pid=1175
-
题目描述:
-
牌只有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。
-
样例输入:
-
12233445566677 33
-
样例输出:
-
YES
分析
这题一开始只是想到把b的每个元素累加,得到所有能够压过b的牌,然后判断这些能压过b的牌是否是a的子串
但是有种例外
112233445577
12345
这个时候23456不是a的子串,需要特殊处理一下。
总的来说这题只需要用string类的find方法做,就会很轻松
int temp = s1.find(s2);
if(temp!=s1.npos)
{
r_flag = 1;
break;
}
ac代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stack>
#include <map>
#define INF 2<<20
#define BASE 1000
using namespace std;
int main ()
{
string s1,s2;
int coun[12];
while(cin>>s1>>s2)
{
int len1=s1.length();
int len2=s2.length();
if(len2<=4)
{
int flag = s2.find("9");
int r_flag = 0;
while((flag==s2.npos))
{
for(int i=0; i<s2.length(); i++)
s2[i] += 1;
int temp = s1.find(s2);
if(temp!=s1.npos)
{
r_flag = 1;
break;
}
flag = s2.find("9");
}
if(r_flag)
printf("YES\n");
else
printf("NO\n");
}
else
{
memset(coun,0,sizeof(coun));
for(int i=0;i<s1.length();i++)
coun[s1[i]-'0']++;
int ma=0;
for(int i=9;i>=5;i--)
if(coun[i]&&coun[i-1]&&coun[i-2]&&coun[i-3]&&coun[i-4])
{
ma = i;
break;
}
if(ma>s2[4]-'0')
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}