列表

详情


NC54031. 小天当地主

描述

某天小明,小强,小天一起打斗地主。这一把轮到了小天当地主,他手里最后还剩下了n张牌,他想问能否把这n张牌以顺子一次出完。
顺子是五张或更多连续的单牌,但是不包括2点和双王,例如3,4,5,6,7是顺子,8,9,10,J,Q,K,A也是顺子,而8,9,J,Q,K不是顺子
牌大小顺序为:3<4<5<6<7<8<9<10<J<Q<K<A<2<M<N
2-9代表牌2-9,0代表牌10,J,Q,K,A分别代表牌J,Q,K,A。N,M分别代表大小王。

输入描述

输入格式:
输入文件包含多行行
第一行一个数字T--样例个数

接下来T行每行输入一个字符串s表示小天手上的牌。

【数据规模与约定】
规定|s|表示字符串s的长度
对于10%的数据,T=1,|s|<5
对于20%的数据,T<=10,|s|<5
对于50%的数据,T<=100,|s|<=15
对于100%的数据,T<=10000,|s|<=15

输出描述

输出格式:
输出文件包含多行
对每个样例输出一行
如果小天能以顺子一次出完输出"YES"
否则输出"NO"

示例1

输入:

1
890JQ

输出:

YES

说明:

8,9,10,J,Q是5张连牌

示例2

输入:

1
8890JQ

输出:

NO

说明:

8,8,9,10,J,Q无法以顺子一次出完

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 28ms, 内存消耗: 504K, 提交时间: 2020-06-17 09:15:46

#include<bits/stdc++.h>
using namespace std;
void change(string &str,string a,string b)
{
    int t;
    if((t=str.find(a))!=-1)
        str = str.replace(str.find(a),1,b);
}
int main()
{
    string name="3456789EFGHI";
    int T;
    cin>>T;
    while(T--)
    {
        string str;
        cin>>str;
        if(str.size()<5)
            puts("NO");
        else
        {
            change(str,"0","E");
            change(str,"J","F");
            change(str,"Q","G");
            change(str,"K","H");
            change(str,"A","I");
            sort(str.begin(),str.end());
            if(name.find(str)!=-1)
                puts("YES");
            else
                puts("NO");
        }
    }
    return 0;
}

Java(javac 1.8) 解法, 执行用时: 660ms, 内存消耗: 47648K, 提交时间: 2019-12-06 15:58:32

import java.util.Arrays;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String n = in.nextLine();

    for (int i = 0; i < Integer.parseInt(n); i++) {
      String str = in.nextLine();
      str = str.replace('0', 'I');
      str = str.replace('K', 'R');
      str = str.replace('A', 'S');
      char[] cs = str.toCharArray();
      Arrays.sort(cs);
      str = new String(cs);

      if (str.length() > 4 && "3456789IJQRS".contains(str)) {
        System.out.println("YES");
      } else {
        System.out.println("NO");
      }
    }

  }
}

Python(2.7.3) 解法, 执行用时: 97ms, 内存消耗: 3308K, 提交时间: 2019-11-28 14:56:03

import sys

def check(line):
    if len(line) < 5:
        return "NO"
    m = {'A':14,
        '2':115,
        '3':3,
        '4':4,
        '5':5,
        '6':6,
        '7':7,
        '8':8,
        '9':9,
        '0':10,
        'J':11,
        'Q':12,
        'K':13,
        'N':116,
        'M':117}
    values = []
    for char in line:
        values.append(m[char])
    values.sort()
    for i in range(1, len(values)):
        if values[i] - values[i-1] != 1:
            return "NO"
    return "YES"

n = int(raw_input())
for i in range(n):
    line = raw_input()
    print check(line.strip())

Python3 解法, 执行用时: 136ms, 内存消耗: 4648K, 提交时间: 2022-04-30 21:57:06

s = ['3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A', '2', 'M', 'N']
t = int(input())
for i in range(t):
    w = input()
    r = 'YES'
    a = [s.index(j) for j in w]
    a.sort()
    if max(a) > 11:
        r = 'NO'
    if len(a) < 5:
        r = 'NO'
    for j in range(1, len(a)):
        if a[j - 1] + 1 != a[j]:
            r = 'NO'
            break
    print(r)

pypy3(pypy3.6.1) 解法, 执行用时: 358ms, 内存消耗: 25716K, 提交时间: 2019-12-07 01:08:53

no_lines = int(input())
cards = '3456789opqrs'

def check_seq(line):
    line = line.replace('0','o').replace('J','p').replace('Q','q').replace('K','r').replace('A','s')
    line = ''.join(sorted(line))

    if len(line) >= 5 and line in cards:
        print("YES")
    else:
        print("NO")

for i in range(no_lines):
    line = input().strip()
    check_seq(line)

上一题