搞了好久
#include<iostream>
#include<cstring>
using namespace std;
#define MAXN 1000
#define MAXK 100
int a[MAXK + 1][MAXN + 1];//a[i][]记录第i次称量的结果
char op[MAXK + 1];//记录第i次的天平倾斜情况
bool coin[MAXN + 1];//true为真硬币,false表示可能为假硬币
int N, K;
//假设i号硬币是假币,假设假币更轻
//如果能通过假币测验,返回true,否则返回false
bool is_false_coin1(int i) {
//cout << "---------------" << endl;
for (int k = 1; k <= K; k++) {//K次结果
bool flag = false;//没有假币出现
for (int j = 1; j<=2*a[k][0]; j++) {
if (a[k][j] == i) {//本次结果中包含假币
flag = true;
if ((j <= a[k][0])&(op[k] != '>'))return false;
if ((j > a[k][0])&(op[k] != '<'))return false;
}
}
if(!flag) {
if (op[k] != '=')return false;
}
}
return true;
}
//假设假币更重
bool is_false_coin2(int i) {
for (int k = 1; k <= K; k++) {//K次结果
bool flag = false;//没有假币出现
for (int j = 1; j <= 2 * a[k][0]; j++) {
if (a[k][j] == i) {//本次结果中包含假币
flag = true;
if ((j <= a[k][0])&(op[k] != '<'))return false;
if ((j > a[k][0])&(op[k] != '>'))return false;
}
}
if (!flag) {
if (op[k] != '=')return false;
}
}
return true;
}
int main() {
memset(coin, false, sizeof(coin));
memset(a, 0, sizeof(a));
cin >> N >> K;
for (int k = 1; k <= K; k++) {//用于控制k次称量结果的记录
int num; cin >> num;
a[k][0] = num;
for (int i = 1; i <= 2 * num; i++) {
cin >> a[k][i];//a[i][]记录第i次称量的结果
}
cin >> op[k];
}
//通过称量结果分析硬币真假
for (int i = 1; i <= N; i++) {
if (is_false_coin1(i)|| is_false_coin2(i)) {//假如i号硬币可以通过假币测验
}
else {//不能同过假币测验,那么一定是真币
coin[i] = true;
}
}
int coin_false = 0;
int id;
for (int i = 1; i <= N; i++) {
if (!coin[i]) {
coin_false++;
id = i;
}
}
if (coin_false == 1) {
cout << id << endl;
}
else {
cout << 0 << endl;
}
return 0;
}