题解 CF546C
题解 CF546C
这个题看起来很难,其实是一个模拟题
大体思路就是模拟每个人拿出手牌,并且比较,然后放入相应的人的手牌中的过程
然后让我们想一下,如何才能便捷的完成上面的过程呢?
可以用数组模拟对吧,但是,我们可以用便捷的STl
的 queue
来实现
拿出的手牌可以直接用一个变量来取出队列的 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;
}