洛谷题目链接
分析
记录上一个出牌的人的出牌数量,和出牌种类,用桶来记录每个人每种牌的数量,枚举每一种种类,如果当前牌的数量大于上一次的出牌数量,则判断其种类,如果种类小于上一次出牌的种类,则需要比上次多出一张牌,否则就跟上一次出牌数量一样多,如果当前牌的数量等于上一次的出牌数量,则判断其种类,如果数量小于,则大小肯定小于上次出牌的大小,不必考虑。文章来源:https://www.toymoban.com/news/detail-792751.html
记录连续出不起牌的人的数量,如果有两个人连续出不起牌,则开始一个新的回合,判断谁赢了就判断他的牌是否出完即可。文章来源地址https://www.toymoban.com/news/detail-792751.html
代码
#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;
}
/*
*/
到了这里,关于洛谷 P8836 [传智杯 #3 决赛] 打牌的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!