输入有多组数据。 每组输入两个字符串(字符串大小不超过100)a,b。a字符串代表手中牌,b字符串代表出的牌。
压过输出YES 否则NO。
12233445566677 33
YES
#include <cstdio> #include <cstring> #include <memory> const int N = 100; int main() { char a[N], b[6]; int num[10]; while (scanf("%s%s", a, b) != EOF) { memset(num, 0, sizeof(num)); int len_a = strlen(a); int len_b = strlen(b); bool flag = false; for (int i = 0; i < len_a; i++) { num[a[i] - '0']++; } if (len_b < 5) { for (int i = b[0] - '0' + 1; i < 10; i++) { if (num[i] >= len_b) { flag = true; break; } } } else { for (int i = b[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) { flag = true; break; } } } if (flag) printf("YES\n"); else printf("NO\n"); } return 0; }
# include<stdio.h> # include<string.h> int main() { //手中牌 char str[101]; //待处理的牌 char card[10]; //计数数组,代表每个数字有多少个,‘0’记录在arr[0]中 int arr[10]; while(scanf("%s",str)!=EOF) { scanf("%s",card); int s_len=strlen(str); int c_len=strlen(card); for(int i=0;i<10;i++) { arr[i]=0; } //'0'的ascii码表的十进制是48 for(int i=0;i<s_len;i++) { arr[str[i]-48]++; } //情况1 if(c_len==1) { //flag==0为NO int flag=0; for(int i=0;i<10;i++) { if(arr[i]>0&&i>card[0]-48) { flag=1; break; } } if(flag==1) printf("YES\n"); else printf("NO\n"); } //情况2 if(c_len==2) { //flag==0为NO int flag=0; for(int i=0;i<10;i++) { if(arr[i]>1&&i>card[0]-48) { flag=1; break; } } if(flag==1) printf("YES\n"); else printf("NO\n"); } //情况3 if(c_len==3) { //flag==0为NO int flag=0; for(int i=1;i<10;i++) { if(arr[i]>2&&i>card[0]-48) { flag=1; //printf("%d %d\n",arr[i],i); break; } } if(flag==1) printf("YES\n"); else printf("NO\n"); } //情况4 if(c_len==4) { //flag==0为NO int flag=0; for(int i=0;i<10;i++) { if(arr[i]>3&&i>card[0]-48) { flag=1; break; } } if(flag==1) printf("YES\n"); else printf("NO\n"); } //情况5 if(c_len==5) { //flag==0为NO int flag=0; for(int i=2;i<=5;i++) { //连续5个数字,并且要求数字数量大于1 if(arr[i]>0&&arr[i+1]>0&&arr[i+2]>0&&arr[i+3]>0&&arr[i+4]>0&& i>card[0]-48) { flag=1; break; } } if(flag==1) printf("YES\n"); else printf("NO\n"); } } return 0; }
#include<iostream> #include<string> using namespace std; int main() { int n, i, count[10]; string a, b; bool flag = false; while(cin >> a >> b) { for(i = 0;i < 10;++i) count[i] = 0; for(i = 0;i < a.size();++i) //统计数量 ++count[a[i] - '0']; if(b.size() < 5) //前四个一种情况,看数量 { for(i = b[0] + 1 -'0';i < 10;++i) { if(count[i] >= b.size()) { flag = true; break; } } } else //顺子,看连续 { n = 0; for(i = b[1] - '0';i < 10;++i) { if(count[i] != 0) ++n; else n = 0; if(n == 5) { flag = true; break; } } } if(flag) cout << "YES" << endl; else cout << "NO" <<endl; }//while return 0; }
#include<stdio.h> #include<string.h> //将每张牌的数量进行统计,分为2中牌型进行求解 int case1(int a[],int n,int length){ int i; for(i=8;i>=0;i--){ //i+1为牌的牌面 if(n<i+1&&length<=a[i]) return 1; } return 0; } int case2(int a[],int n){ int i; for(i=8;i>=4;i--){ if(i+1>n&&a[i]>0&&a[i-1]>0&&a[i-2]>0&&a[i-3]>0&&a[i-4]>0) return 1; } return 0; }int main(){ char b[100],c[100]; int result,a[9]={0},i,lengthb,lengthc; while(scanf("%s%s",b,c)!=EOF){ lengthb=strlen(b); lengthc=strlen(c); for(i=0;i<lengthb;i++) a[b[i]-48-1]++; if(lengthc<=4) result=case1(a,c[0]-48,lengthc); else result=case2(a,c[4]-48); if(result==1) printf("YES\n"); else printf("NO\n"); } }
#include<iostream> #include<string> #include<sstream> using namespace std; //数字转字符串 常用 string itoa(int i){ stringstream s; s << i; return s.str(); } //***1、2、3、4种情况 bool matching(string a, int _b, int type) { string _str; for (int i = _b + 1; i <= 9; ++i){ _str = ""; for (int j = 0; j < type; ++j){ _str += itoa(i); } if (a.find(_str) != a.npos) return true; } return false; } int main(){ string a, b; cin >> a >> b; int type = b.size(); bool result = false; //判断是哪种类型的出牌 int _b = b[0] - '0'; //char 转成 int //单独*** if (type == 5){ string _str; bool flag = false; if (_b <= 5){ for (int i = _b + 1; i <= 5; ++i){ int _c = i; int j = 0; for (; j < 5; ++j, ++_c){ if (a.find(itoa(_c)) == a.npos){ //假如有一个数字没找到就直接跳出这一循环 break; } } if (j == 5) //表示联系的5个数字都找到 flag = true; } //标志为真 则查找成功 if (flag) result = true; } } else { result = matching(a, _b, type); } if (result) cout << "YES"; else cout << "NO"; return 0; }
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int main(void) { string a,b; while(cin >> a >> b) { sort(a.begin(),a.end()); while(1)//这个循环是为了防止b + 1后在a中没找到,继续加1直到找到能压过b的字符串 { if(b[0] == '9') { cout << "NO" << endl;//当为9的时候牌已经最大了,压不过 break; } for(int i = 0;i < b.size();i++)//更新比b大的字符串 b[i] += 1; //find(b)函数用于寻找b字符串并返回对应字符串的首字符的数组下标,没找到则返回一个npos if(a.find(b) != a.npos)//对子或叠牌的情况 { cout << "YES" << endl; break; } string c = a; unique(c.begin(), c.end());//去掉重复的相邻字符,前提是已经排序好的字符串 if(c.find(b) != c.npos)//顺子的情况如:12345 { cout << "YES" << endl; break; } } } return 0; }
#include<stdio.h> #include<string.h> int main(){ int a[20]; memset(a,0,sizeof(a)); char ans[100]; gets(ans); int le=strlen(ans); for(int i=0;i<le;i++) a[ans[i]-48]++;//经大神指点,字符串和数字以‘0’-48=0转换 char b[6]; gets(b); int l=strlen(b); int i=b[0]-48+1; switch(l){ case 1: if(b[0]-48==9) printf("NO"); else{ for(i=b[0]-48+1;i<10;i++){ if(a[i]){ printf("YES"); break; } } if(i==10) printf("NO"); } break; case 2: if(b[0]-48==9) printf("NO"); else{ for(i=b[0]-48+1;i<10;i++){ if(a[i]>1){ printf("YES"); break; } } if(i==10) printf("NO"); } break; case 3: if(b[0]-48==9) printf("NO"); else{ for(i=b[0]-48+1;i<10;i++){ if(a[i]>2){ printf("YES"); break; } } if(i==10) printf("NO"); } break; case 4: if(b[0]-48==9) printf("NO"); else{ for(i=b[0]-48+1;i<10;i++){ if(a[i]>3){ printf("YES"); break; } } if(i==10) printf("NO"); } break; case 5: if(b[0]-48==5) printf("NO"); else{ for(i=b[0]-48+1;i<6;i++){ if(a[i]&&a[i+1]&&a[i+2]&&a[i+3]&&a[i+4]){ printf("YES"); break; } } if(i==6) printf("NO"); } break; } return 0; }
#include<bits/stdc++.h>
#define ll long long
#define len 5
using namespace std;
string a,b;
int change[105];
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>a>>b)
{
for(int i=0;i<a.size();i++)
{
change[a[i]-'0']++;
}
if(b.size()<5)
{
for(int i=0;i<a.size();i++)
{
if(a[i]>b[0]&&change[a[i]-'0']>=b.size())
{
cout<<"YES"<<endl;
break;
}
if(i==a.size()-1)
cout<<"NO"<<endl;
}
}
else
{
for(int j=0,i;j<a.size()-4;j++)
{
i=a[j]-'0';
if(a[j]>b[0]&&change[i]>0&&change[i+1]>0&&change[i+2]>0&&change[i+3]>0&&change[i+4]>0)
{
cout<<"YES"<<endl;
break;
}
if(j==a.size()-5)
cout<<"NO"<<endl;
}
}
memset(change,0,sizeof(change));
}
return 0;
}
#include<iostream> #include<string> #include<algorithm> using namespace std; int a[10]= {0}; int main() { string str,s; while( cin>>str>>s) { for(int i=0; i<str.size(); i++) { int num=str[i]-48; a[num]++; } if(s.size()<=4) { int num=s[0]-48; int i; for( i=num+1; i<=9; i++) { if(a[i]>=s.size()) { cout<<"YES"<<endl; break; } } if(i>9) cout<<"NO"<<endl; } else if(s.size()==5) { int num=s[0]-48; int flag=0,i; for( i=num+1; i<=9; i++) { if(a[i]>=1) { flag++; if(flag>=5) { cout<<"YES"<<endl; break; } } else flag=0; } if(i>9) cout<<"NO"<<endl; } } }
编到一半,发现哈希计数很简单,不过,我还是把我第一次的思路实现了。 swicth的重复可以提取出来,自行优化
package com.speical.first;
import java.util.Scanner;
public class Pro190 {
public static boolean compare(String strA, String strB) {
boolean flag = false;
int index = 0;
for(; index < strA.length(); index++) {
if(strA.charAt(index) > strB.charAt(0)) {
break;
}
}
int count;
if(index < strA.length()) {
switch (strB.length()) {
case 1: flag = true; break;
case 2:
for(int j = index; j < strA.length();) {
if((++j) < strA.length() && strA.charAt(j) == strA.charAt(j - 1)) {
flag = true;
break;
}
}
break;
case 3:
for(int j = index; j < strA.length();) {
count = 2;
while((++j) < strA.length() && strA.charAt(j) == strA.charAt(j - 1)) {
count--;
}
if(count == 0) {
flag = true;
break;
}
}
break;
case 4:
for(int j = index; j < strA.length();) {
count = 3;
while((++j) < strA.length() && strA.charAt(j) == strA.charAt(j - 1)) {
count--;
}
if(count == 0) {
flag = true;
break;
}
}
break;
case 5:
char ch;
for(int j = index; j < strA.length(); j++) {
count = 4;
ch = strA.charAt(j);
while(strA.indexOf((char)(++ch)) != -1 && count-- > 0);
if(count == 0) {
flag = true;
break;
}
}
break;
}
}
return flag;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
String strA = input.nextLine();
String strB = input.nextLine();
System.out.println(compare(strA, strB) ? "YES" : "NO");
}
}
}
#include <bits/stdc++.h> using namespace std; int a[10]; int main() { string s,s1; while(cin>>s>>s1) { for(int i=0;i<s.size();i++) { a[s[i]-'0']++; } //五张牌特殊处理 if(s1.size()==5) { int tag=0; for(int i=s1[0]-'0'+1;i<=5;i++)//以i开头连续5个 { int flag=1; for(int j=0;j<=4;j++) { if(a[i+j]==0) { flag=0;//中间某张没有 break; } } if(flag) tag=1;//五张都有 } if(tag) { cout<<"YES"<<endl; } else cout<<"NO"<<endl; } else { int flag=0; for(int j=s1[0]-'0'+1;j<=9;j++) { if(a[j]>=s1.size()) { flag=1; break; } } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string a, b; while (cin >> a >> b) { vector<int>number(10); //各个数字在字符串a中的个数 for (const auto& ch : a) { number[ch - '0']++; } int n = b.length(); bool flag = false; if (n <= 4) { for (int i = b[0] - '0' + 1; i <= 9; i++) { if (number[i] >= n) { flag = true; break; } } } else { int count = 0; if (b[0] >= '5') { flag = false; } else { for (int i = b[0] - '0' + 1; i <= 9 && count < 5; i++) { if (number[i] > 0) { count++; } else { count = 0; } } flag = count == 5; } } cout << (flag ? "YES" : "NO") << endl; } return 0; }
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String []args) { Scanner in = new Scanner(System.in); while (in.hasNextLine()) { String a = in.nextLine(); //表示手中的牌 String b = in.nextLine(); //表示出的牌 boolean flag = false; //标识 是否有大过的牌 if (b.length() == 1) { //只有一张牌 char c = b.charAt(0); //读取第一个字符 //判断a中是否有大过c的牌 for (int i = 0; i < a.length(); i++) { if (a.charAt(i) > c) { flag = true; break; } } if (flag) { //能压下去 System.out.println("YES"); flag = false; //重置标识 continue; } else { System.out.println("NO"); } } else if (b.length() >= 2 && b.length() <= 4) { //"对子"、"三连"、"炸" char c = b.charAt(0); for (int i = 0; i < a.length(); i++) { //查看是否有大过的牌 if (a.charAt(i) > c) { int length = getCharacterLength(a, a.charAt(i)); //该字母的牌数 if (length == 1) { //牌只有一张,不满足条件 continue; } if (b.length() == 2) { if (length >= 2) { flag = true; break; } } else if (b.length() == 3) { if (length >= 3) { flag = true; break; } } else { if (length == 4) { flag = true; break; } } } } if (flag) { flag = false; //重置标识 System.out.println("YES"); continue; } else { System.out.println("NO"); } } else { //五张"顺子" int all_character[] = new int[10]; for (int i = 0; i < 10; i++) all_character[i] = 0; for (int i = 0; i < a.length(); i++) { all_character[Integer.parseInt(Character.toString(a.charAt( i)))]++; //对应数字 个数+1 } int record = Integer.parseInt(Character.toString(b.charAt(0))); if (b.charAt(0) == '1') { //为123456 if (all_character[record + 1] != 0 && all_character[record + 2] != 0 && all_character[record + 3] != 0 && all_character[record + 4] != 0 && all_character[record + 5] != 0 || all_character[record + 2] != 0 && all_character[record + 3] != 0 && all_character[record + 4] != 0 && all_character[record + 5] != 0 && all_character[record + 6] != 0 || all_character[record + 3] != 0 && all_character[record + 4] != 0 && all_character[record + 5] != 0 && all_character[record + 6] != 0 && all_character[record + 7] != 0 || all_character[record + 4] != 0 && all_character[record + 5] != 0 && all_character[record + 6] != 0 && all_character[record + 7] != 0 && all_character[record + 8] != 0) { flag = true; } } else if (b.charAt(0) == '2') { if (all_character[record + 1] != 0 && all_character[record + 2] != 0 && all_character[record + 3] != 0 && all_character[record + 4] != 0 && all_character[record + 5] != 0 || all_character[record + 2] != 0 && all_character[record + 3] != 0 && all_character[record + 4] != 0 && all_character[record + 5] != 0 && all_character[record + 6] != 0 || all_character[record + 3] != 0 && all_character[record + 4] != 0 && all_character[record + 5] != 0 && all_character[record + 6] != 0 && all_character[record + 7] != 0) { flag = true; } } else if (b.charAt(0) == '3') { if (all_character[record + 1] != 0 && all_character[record + 2] != 0 && all_character[record + 3] != 0 && all_character[record + 4] != 0 && all_character[record + 5] != 0 || all_character[record + 2] != 0 && all_character[record + 3] != 0 && all_character[record + 4] != 0 && all_character[record + 5] != 0 && all_character[record + 6] != 0) { flag = true; } } else if (all_character[record + 1] != 0 && all_character[record + 2] != 0 && all_character[record + 3] != 0 && all_character[record + 4] != 0 && all_character[record + 5] != 0) { if (a.contains("56789")) { flag = true; } } if (flag) { flag = false; //重置标识 System.out.println("YES"); continue; } else { System.out.println("NO"); } } } } /** * 得到某个字符总长度 * @param a * @param c * @return */ public static int getCharacterLength(String a, char c) { int length = 0; for (int i = 0; i < a.length(); i++) { if (a.charAt(i) == c) length++; } return length; } }
我最短!
#include <iostream> #include <string> #include <array> #include <algorithm> using namespace std; array<string, 5> five{"12345", "23456", "34567", "45678", "56789"}; int main() { string a, b; while (cin >> a >> b){ bool flag = false; if (b.size() <= 4){ while (b[0] < '9'){ for (char & c : b) c += 1; if (a.find(b) != string::npos){ flag = true; break; } } }else{ a.resize(unique(a.begin(), a.end()) - a.begin()); //去重 for (int i = (b[0] - '0'); i < 5; ++i) if (a.find(five[i]) != string::npos){ flag = true; break; } } if (flag) cout << "YES" << endl; else cout << "NO" << endl; } }
a=input() b=input() l=len(b) if l==1: x=int(b) flag=0 for i in a: if int(i)>x: flag=1 break if flag==0: print('NO') else: print('YES') elif l==2: x=int(b[0]) flag=0 for i in a: if int(i)>x and a.count(i)>=2: flag=1 break if flag==0: print('NO') else: print('YES') elif l==3: x=int(b[0]) flag=0 for i in a: if int(i)>x and a.count(i)>=3: flag=1 break if flag==0: print('NO') else: print('YES') elif l==4: x=int(b[0]) flag=0 for i in a: if int(i)>x and a.count(i)>=4: flag=1 break if flag==0: print('NO') else: print('YES') else: if b=='56789': print('NO') elif b=='45678': if '5' in a and '6' in a and '7' in a and '8' in a and '9' in a: print('YES') else: print('NO') elif b=='34567': if '5' in a and '6' in a and '7' in a and '8' in a : if '4' in a&nbs***bsp;'9' in a: print('YES') else: print('NO') else: print('NO') elif b=='23456': if '5' in a and '6' in a and '7' in a: if ('3' in a and '4' in a)&nbs***bsp;('4' in a and '8' in a)&nbs***bsp;('8' in a and '9' in a): print('YES') else: print('NO') else: print('NO') else: if '5' in a and '6' in a: if ('2' in a and '3' in a and '4' in a)&nbs***bsp;('3' in a and '4' in a and '7' in a)&nbs***bsp;('4' in a and '7' in a and '8' in a) &nbs***bsp;('7' in a and '8' in a and '9' in a) : print('YES') else: print('NO') else: print('NO')
#include<stdio.h> int main(){ char hand[105],desk[10]; while(scanf("%s",&hand)!=EOF){ int nums1[10],len2=0; scanf("%s",&desk); for(int i=0;i<10;i++){ nums1[i]=0; } for(int i=0;hand[i]!='\0';i++){ int x=hand[i]-'0'; nums1[x]++; } for(int i=0;desk[i]!='\0';i++){ len2++; } if(len2==1){ int flag=0,y=desk[0]-'0'; for(int i=y+1;i<10;i++){ if(nums1[i]!=0){ flag=1; printf("YES"); break; } } if(flag==0) printf("NO"); } if(len2==2){ int flag=0,y=desk[0]-'0'; for(int i=y+1;i<10;i++){ if(nums1[i]>1){ flag=1; printf("YES"); break; } } if(flag==0) printf("NO"); } if(len2==3){ int flag=0,y=desk[0]-'0'; for(int i=y+1;i<10;i++){ if(nums1[i]>2){ flag=1; printf("YES"); break; } } if(flag==0) printf("NO"); } if(len2==4){ int flag=0,y=desk[0]-'0'; for(int i=y+1;i<10;i++){ if(nums1[i]>3){ flag=1; printf("YES"); break; } } if(flag==0) printf("NO"); } if(len2==5){ int flag=0,y=desk[0]-'0'; for(int i=y+1;i<6;i++){ int count=0; for(int j=0;j<5;j++){ if(nums1[i+j]!=0) count++; } if(count==5){ flag=1; printf("YES"); break; } } if(flag==0) printf("NO"); } } return 0; }
#include<stdio.h> #include<string.h> int main(void) { int tmp[10] = {0}; char a[100]; char b[5]; scanf("%s", &a); scanf("%s", &b); int i; for (i=0; i<strlen(a); i++) { //记录每个数字出现了多少次。 tmp[a[i]-'0']++; } if (strlen(b)<5) { // 非同花顺 for (i=b[0]-'0'+1; i<10 && tmp[i]<strlen(b);i++); i==10?printf("NO"):printf("YES"); } else { // 同花顺 for (i=b[0]-'0'+1; i<6 && (tmp[i]*tmp[i+1]*tmp[i+2]*tmp[i+3]*tmp[i+4]==0); i++); i==6?printf("NO"):printf("YES"); } return 0; }