列表

详情


NC200310. G-虚数的纸牌

描述

这次是一个成年男性,他正在玩弄着手上的扑克牌,纸牌在他手中翻飞着,如同空中飞舞的蝴蝶。
「死后居然被计入英灵座,现在居然还被召唤到这里,真是很奇妙啊」他先发言了「我并无任何武艺,但对数学方面略有心得,我即为七骑之中的魔术师(caster)」
「呜」他所说的信息实在太少太少了,我根本没法判别他的真名
「你们能到达这里必是多少有些许智慧的」他直接把17张扑克牌飞了过来。扑克牌如同利刃一般飞来,但并没有故意瞄准我,这也叫没有什么武艺么
「我对赌博很有兴趣,但是这纸牌游戏也只是无趣的记忆游戏。捡起这些纸牌吧。」他从牌堆里面也抽出了17张牌「和我玩一场游戏,赢了就可以过去,输了就永远在这复数的空间里徘徊」
(规则与实际斗地主有出入,请以本题题面为准)
给出17张牌,计算刚开局总共有多少种不同的出牌方案。
牌的种类,顺序(从小到大):
3 4 5 6 7 8 9 0(代表10) J Q K A 2
出牌方式:
单个牌:单张牌,比如:3
对子:两张种类相同的牌,比如:2,2
炸弹:四张种类相同的牌,比如:6,6,6,6
三带一:有两种牌,一种牌有三张,另一种牌有一张,比如:3,3,3,A
三带二:有两种牌,一种牌有三张,另一种牌有两张,比如:3,3,3,A,A
五单顺子:五张连续的单牌,且五张牌种类各不相同。比如:4,5,6,7,8。五单顺子的牌的种类可以包括`2`,比如:J,Q,K,A,2,也是五单顺子。注意:A,2,3,4,5,不是五单顺子,3,4,5,6,6,也不是五单顺子
由于花色的原因,即使是相同种类的牌,也是不同的牌

输入描述

第一行一个整数T(1<=T<=100),代表T组样例,

对于每组样例,输入一行,每行输入一个仅由{'3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A', '2'}字符组成的字符串str,(|str|==17)。其中|str|代表字符串的长度。

题目保证每种牌最多四张(代表四种花色)

输出描述

对于每一行输入,输出有多少种不同的出牌方案

示例1

输入:

1
AAAA234567890JQKK

输出:

105

说明:

单个牌:17种,A,A,A,A,2,3,4,5,6,7,8,9,0,J,Q,K,K

对子:7种,AA,AA,AA,AA,AA,AA,KK(注意A的不同)

炸弹:1种,AAAA

三带一:52种

三带二:4种,AAAKK, AAAKK, AAAKK, AAAKK

五单顺子:24种

总共:105种

原站题解

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

Python3(3.5.2) 解法, 执行用时: 27ms, 内存消耗: 3560K, 提交时间: 2019-12-08 17:01:51

def f(a):
    cnt=17
    for i in range (13):
        if a[i]==4:cnt+=7
        elif a[i]==2:cnt+=1
        elif a[i]==3:cnt+=3
    for i in range(13):
        if a[i]==3:cnt+=14
        elif a[i]==4:cnt+=52
    for i in range(13):
        if a[i]==3:
            cnt+=a.count(2)
            cnt+=(a.count(3)-1)*3
            cnt+=(a.count(4))*6
        if a[i]==4:
            cnt+=a.count(2)*4
            cnt+=(a.count(3))*12
            cnt+=(a.count(4)-1)*24
    for i in range(9):
        x=a[i]*a[i+1]*a[i+2]*a[i+3]*a[i+4]
        if x!=0 :cnt+=x
    return cnt
T=int(input())
b = ['3','4','5','6','7','8','9','0','J','Q','K','A','2']
for i in range (T):
    s = input()
    a = [0] * 13
    for j in range(13):
        a[j] = s.count(b[j])
    print(f(a))

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 484K, 提交时间: 2019-12-07 21:32:25

#include <iostream>
using namespace std;
int main()
{
    int T,i,sum;
	cin>>T;
	char card[17];
	while(T--)
	{
		sum=17;
		int a[13]={0};
		int num[5]={0};
		cin>>card;
		for(i=0;i<17;++i) 
		{
			if(card[i]=='0') a[7]++;
			else if(card[i]=='J') a[8]++;
			else if(card[i]=='Q') a[9]++;
			else if(card[i]=='K') a[10]++;
			else if(card[i]=='A') a[11]++;
			else if(card[i]=='2') a[12]++;
			else a[(int)card[i]-51]++;
		}
		for(i=0;i<13;++i) 
		{
			num[a[i]]++;
			if(i<9) sum+=a[i]*a[i+1]*a[i+2]*a[i+3]*a[i+4];
			if(a[i]>=2) sum+=a[i]*(a[i]-1)/2;
		}
		if(num[3]!=0) sum+=num[3]*(num[4]*6+(num[3]-1)*3+num[2])+num[3]*14;
		if(num[4]!=0) sum+=num[4]*4*((num[4]-1)*6+num[3]*3+num[2])+num[4]*4*13+num[4];
		cout<<sum<<endl;
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 352K, 提交时间: 2019-12-13 17:52:17

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	long long t;
	cin>>t;
	while(t--)
	{
		string x;
		cin>>x;
		long long a[128]={0},b[5]={0};
		for(long long i=0;i<17;i++)
		{
			a[int(x[i])]++;
		}
		for(long long i=0;i<128;i++)
		{
			b[a[i]]++;
		}
		long long ans=17;
		ans+=b[2]+b[3]*3+b[4]*6;
		ans+=b[4];
		ans+=b[3]*14+b[4]*4*13;
		ans+=b[3]*b[2]+b[3]*(b[3]-1)*3+b[3]*b[4]*6+b[4]*4*b[2]+b[4]*4*b[3]*3+b[4]*4*(b[4]-1)*6;
		char c[13]={'3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A', '2'};
		for(long long i=0;i<=8;i++)
		{
			ans+=a[c[i]]*a[c[i+1]]*a[c[i+2]]*a[c[i+3]]*a[c[i+4]];
		}
		cout<<ans<<endl;
	}
}

上一题