您的位置:首页 > 其它

codeforces 546C (队列)

2016-10-21 11:53 197 查看

题目链接:点击这里

题意:给出两堆数,每次两人都取堆顶的数字比大小,大的人得到这两个数,并把对方的数先放到自己的堆底,再把自己的数放到自己的堆底。最后没有数字的人输,求出结束的步数以及赢家。

因为数字最多只有10个,所以大概不同的状态有400W次。直接用队列模拟400W次看有没有结束即可。

#include <bits/stdc++.h>
using namespace std;
#define maxn 4000005

deque <int> g1, g2;
int n, x, y;

int main () {
scanf ("%d", &n);
while (!g1.empty ()) g1.pop_back (); while (!g2.empty ()) g2.pop_back ();
scanf ("%d", &x);
for (int i = 1; i <= x; i++) {
int tmp; scanf ("%d", &tmp);
g1.push_back (tmp);
}
scanf ("%d", &y);
for (int i = 1; i <= y; i++) {
int tmp; scanf ("%d", &tmp);
g2.push_back (tmp);
}
int cnt = 0;
while (!g1.empty () && !g2.empty ()) {
int u = g1.front (), v = g2.front ();
g1.pop_front (); g2.pop_front ();
if (u > v) {
g1.push_back (v);
g1.push_back (u);
}
else {
g2.push_back (u);
g2.push_back (v);
}
cnt++;
if (cnt == maxn) {
cout << -1 << endl;
return 0;
}
}
cout << cnt << " ";
if (g1.empty ()) {
cout << 2 << endl;
}
else cout << 1 << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: