https://www.luogu.com.cn/problem/T172099?contestId=42343
1、如何模拟出牌顺序?
用t记录上一次出牌的人,如果有连续两次人出不去牌,x和t将会相等,这时候进行下一轮
2、如何存储每个人的牌?
用二维数组存储,第一维表示是第i个人,第二维表示牌型,存储的值是每个牌型的数量
用c[x]存储第i个人的总共牌的数量,当这个数归0的时候,代表这个人赢了
3、如何模拟每次出牌?
T{x, y}x表示当前的牌数,j表示当前的牌型
用两个for循环,第一层是从小到大枚举牌的数量,第二层是牌型,如果j牌型的数量>=i,并且i比t.x大
这里应该会首先满足第二个条件,再满足第一个条件
#include <iostream>
using namespace std;
const int N = 1e3 + 10;
int n, m;
int a[4][N], c[N];
struct T {
int x, y;
};
inline T query (int x, T t) {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j ++)
if (a[x][j] >= i && (i > t.x || i == t.x && j > t.y)) {
a[x][j] -= i;
c[x] -= i;
return T {i, j};
}
return {-1, 1e9};
}
int main () {
cin >> n >> m;
for (int i = 1; i <= 3; i++) c[i] = n;
for (int i = 1; i <= 3; i ++)
for (int x, j = 1; j <= n; j ++) {
cin >> x;
a[i][x] ++;
}
for (int i = 1, t;; i = t) {
t = 0; T tmp = {0, 0};
for (int x = i; x ^ t; x = x % 3 + 1) {
T q = query (x, tmp);
if (!c[x]) {
cout << x;
return 0;
}
if (~q.x) t = x, tmp = q;
}
}
}