题目链接: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
题目比较水。
思路:前四种其实可以归类于一种。但是要注意的是444是可以压过22的。因为只有四种牌型,而且,已经排序,直接从前往后扫,对每一种牌型进行最大牌标记a[]。
对于第五种因为只有100字符大小,且只有五种型号,可以直接暴力。当然直接判断第一个字符直接找就可以。
注意的就是边界处理和第五种情况中间缺牌细节,鄙逗考虑到了这种情况但是写的时候忘了加,WA了一次SAD...看到别人的样例的时候还信心满满的觉得自己能过找了半天发现呵呵了,自己就是没写。。。
其实前一天晚上就能A但是自己想玩看电影去了,第二天就把那个地方忘了写。。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
char stra[1005];
char strb[1005];
int a[10];
int main()
{
while(scanf("%s",stra) != EOF)
{
memset(a,0,sizeof(a));
scanf("%s",strb);
int len,temp;
len = strlen(stra);
int i,j,count;
count = 1;
temp = stra[0];
int lenb = strlen(strb);
if(lenb < 5)
{
for(i = 0; i < len; i++)
{
if(i == 0)
temp = stra[0],count = 1;
else if(temp == stra[i])
count++;
else
{
a[count] = stra[i-1]-'1'+1;
temp = stra[i];
for(j = 1;j < count;j++)
{
a[j] = a[count];
}
count = 1;
}
if(i == len-1)
{
a[count] = stra[i]-'1'+1;
for(j = 1;j < count;j++)
{
a[j] = a[count];
}
}
}
len = strlen(strb);
if(a[len] > strb[0]-'1'+1)
printf("YES\n");
else
printf("NO\n");
}
else
{
int i,j,s,flag;
i = 0;
while(i < len)
{
if(stra[i] > strb[0])
break;
i++;
}
int pre;
pre = stra[i];
count = 1;
flag = 0;
for(i = i+1;i < len;i++)
{
if(pre == stra[i]-1)
count++,pre = stra[i];
else if(pre < stra[i]-1)
count = 1,pre = stra[i];
if(count == 5){
flag = 1;break;
}
}
if(flag)
puts("YES");
else
puts("NO");
}
}
return 0;
}