题解 CF546C

题解 CF546C

codeforces网址

这个题看起来很难,其实是一个模拟题

大体思路就是模拟每个人拿出手牌,并且比较,然后放入相应的人的手牌中的过程

然后让我们想一下,如何才能便捷的完成上面的过程呢?

可以用数组模拟对吧,但是,我们可以用便捷的STlqueue来实现

拿出的手牌可以直接用一个变量来取出队列的 front,然后比较两个 front

因为需要把自己的手牌放在对方的手牌之上,所以应该先 push 对方的手牌,再 push 自己的手牌

因为如果一直不能结束就输出 \(-1\) ,而且没有明确的边界,所以我们可以直接玄学把 10^4 当做边界

最后如果有一个人的手牌没有了,直接输出当前的步数和另一个人的编号即可

#include<cstdio>
#include<queue>
using namespace std;
queue<int> q[3];
int n;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=2;i++){
		scanf("%d",&n);
		for(int j=1;j<=n;j++){
			int x;
			scanf("%d",&x);
			q[i].push(x);
		}
	}
	for(int i=1;i<10000;i++){
		if(q[1].empty()){
			printf("%d 2",i-1);
			return 0;
		}
		if(q[2].empty()){
			printf("%d 1",i-1);
			return 0;
		}
		if(q[1].front()>q[2].front()){
			int t=q[1].front();
			q[1].pop();
			q[1].push(q[2].front());
			q[2].pop();
			q[1].push(t);
		}else{
			int t=q[2].front();
			q[2].pop();
			q[2].push(q[1].front());
			q[1].pop();
			q[2].push(t);
		}
	}
	printf("-1");
	return 0;
}
posted @ 2022-11-30 09:17  Tyrue  阅读(22)  评论(0编辑  收藏  举报