洛谷 P8836 [传智杯 #3 决赛] 打牌

本文介绍了解决一个洛谷编程题目中的出牌策略问题,通过记录每个人的出牌数量和种类,遵循特定规则决定下一次出牌数量。当两人连续无法出牌时,进入新回合并判断谁先出完牌为胜者。
摘要由CSDN通过智能技术生成

洛谷题目链接

分析

记录上一个出牌的人的出牌数量,和出牌种类,用桶来记录每个人每种牌的数量,枚举每一种种类,如果当前牌的数量大于上一次的出牌数量,则判断其种类,如果种类小于上一次出牌的种类,则需要比上次多出一张牌,否则就跟上一次出牌数量一样多,如果当前牌的数量等于上一次的出牌数量,则判断其种类,如果数量小于,则大小肯定小于上次出牌的大小,不必考虑。

记录连续出不起牌的人的数量,如果有两个人连续出不起牌,则开始一个新的回合,判断谁赢了就判断他的牌是否出完即可。

代码

#include <bits/stdc++.h>
#define debug puts("Y")

using namespace std;

int n, m, a[5][55], sum[5];
int prenum = 1, presiz, vis;

int main(){
	cin >> n >> m;
	for(int i = 1, x; i <= 3; i ++){
		for(int j = 1; j <= n; j ++){
			cin >> x;
			a[i][x] ++, sum[i] ++;
		}
	}
	for(; 114514 == 114514;){
		for(int hm = 1; hm <= 3; hm ++){
			int minnum = 1e9, minsiz = 1e9;
			for(int i = 1; i <= m; i ++){
				if(a[hm][i] > prenum){
					if(i <= presiz){
						if(prenum + 1 < minnum || (prenum + 1 == minnum && i < minsiz)){
							minnum = prenum + 1, minsiz = i;
						}
					}else{
						if(prenum < minnum || (prenum == minnum && i < minsiz)){
							minnum = prenum, minsiz = i;
						}
					}
				}else if(a[hm][i] == prenum && i > presiz){
					if(prenum < minnum || (prenum == minnum && i < minsiz)){
						minnum = prenum, minsiz = i;
					}
				}
			}
			if(minnum == 1e9 && minsiz == 1e9){
				vis ++;
				if(vis == 2){
					prenum = 1, presiz = 0;
					vis = 0;
				}
			}else{
				vis = 0;
				a[hm][minsiz] -= minnum, sum[hm] -= minnum;
				prenum = minnum, presiz = minsiz;
				if(!sum[hm]){
					cout << hm;
					return 0;
				}
			}
		}
	}
	return 0;
}
/*

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值