专栏文章

题解:AT_joi2008yo_c カードゲーム

AT_joi2008yo_c题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miq02qjf
此快照首次捕获于
2025/12/03 20:45
3 个月前
此快照最后确认于
2025/12/03 20:45
3 个月前
查看原文

正文开始:

阅读理解

2n2n 张数字为 12n1\sim2n,两个人轮流出牌,只能出比上一张牌大的牌,当有人无法出牌时,清空桌面。当有人牌出完时,结束游戏,两人得分为对方剩余牌数。
现给出小 AAnn 张牌,求两人得分。

思路:

注意到这道题的范围是 10210^2,所以就可以直接模拟,不用担心其他的。为了模拟的方便,可以先进行排序。

代码实现:

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,i,j;
bool t[1005];
int a[1105],tt1,b[1205],tt2,id;
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(i=1;i<=n;i++)cin>>x,t[x]=1;
	for(i=1;i<=2*n;i++)t[i]?a[++tt1]=i:b[++tt2]=i;//统计两人卡牌 
	while(tt1&&tt2){//有一方已经没牌了就退出 
		x=0,i=1,j=1;//x 为最大值 
		while(i<=n&&j<=n&&tt1&&tt2){//有一方已经不能出牌了就退出 
			if(id==0)
				for(;i<=n;i++){if(a[i]>x){x=a[i],a[i]=0,tt1--;break;}}//寻找符合要求的牌 
			else
				for(;j<=n;j++)if(b[j]>x){x=b[j],b[j]=0,tt2--;break;}//寻找符合要求的牌
			id++,id%=2;//换人 
		}
	}
	cout<<tt2<<'\n'<<tt1<<'\n';//输出对方剩余的牌数 
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...