洛谷 P7866 题解

题目大意

n n n 张扑克牌,求能组成几个由牌点一样且花色有且仅有两种的“小昕昕”。

题目解法

这个题目就是一道有点难度的桶思想的题目,需要用一个二维的数组来当桶,还要与贪心思想结合。

解题的过程主要分为两部分,第一部分是将扑克牌的信息存入道桶中,我用了两个函数处理花色和点数。

之后就是循环扫描桶的环节,首先最外层的循环是点数,之后要分为两种情况来处理。

认真看题目描述,发现只有两副牌,所以相同点数和花色的牌最多出现两张。

所以贪心的思想就是:

  • 如果其中相同的点数正好有 2 + 1 2+1 2+1 个,也就是一种花色是有 2 2 2 张,另外一种有 1 1 1 张。此时我们将这两种花色对应的桶清零;

  • 在排除完前面那种情况以后,还有一种情况,就是这两种花色都有 2 2 2 张,此时就要拆开其中一个来凑。此时我们其中一个的桶清零,另外一个减去一。

参考代码

#include<bits/stdc++.h> 
using namespace std;
char s[3];
int book[15][5],ans;
int check1(char ch){
	if(ch=='A') return 1;
	if(ch=='T') return 10;
	if(ch=='J') return 11;
	if(ch=='Q') return 12;
	if(ch=='K') return 13;
	return ch-'0';
}
int check2(char ch){
	if(ch=='S') return 1;
	if(ch=='H') return 2;
	if(ch=='C') return 3;
	if(ch=='D') return 4;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s+1;
		book[check1(s[2])][check2(s[1])]++;
	}
	for(int i=1;i<=13;i++){
		for(int j=1;j<=4;j++)
			for(int k=1;k<=4;k++)
				if(book[i][j]+book[i][k]==3){
					ans++;
					book[i][j]=0;
					book[i][k]=0;
				}
		for(int j=1;j<=4;j++)
			for(int k=j+1;k<=4;k++)
				if(book[i][j]+book[i][k]>=3){
					ans++;
					if(book[i][j]==2) book[i][j]=0,book[i][k]--;
	                else if(book[i][k]==2) book[i][k]=0,book[i][j]--;
				} 
	}
	cout<<ans;
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值