/* 又是假币判断问题,跟POJ1013类似,不过这个题用1013那个算法WA了...后来换了种枚举的算法才过... 思路就是假币应该在每个不等式中都出现,最后只要看哪个硬币出现的次数和不等式出现的次数相同, 如果这个硬币唯一,那它就是确认的假币。 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 1001 int main() { int n, k, p, total = 0; int i; int count = 0, pos = 0; char sign; /* 记录原始数据 */ int t[MAX] = {0}; /* 标记硬币真假 */ int r[MAX] = {0}; /* 记录硬币重量 */ int w[MAX] = {0}; freopen("1.txt","r",stdin); scanf("%d%d",&n,&k); while (k--) { /* 读入原始数据 */ scanf("%d",&p); for (i = 0; i < 2 * p; i++) { scanf("%d",&t[i]); } getchar(); scanf("%c",&sign); /* 标记肯定为真的硬币 */ if (sign == '=') { for (i = 0; i < 2 * p; i++) { r[t[i]] = 1; } } /* 左轻右重 */ else if (sign == '<') { total++; for (i = 0; i < p; i++) { w[t[i]]--; } for (i = p; i < 2 * p; i++) { w[t[i]]++; } } /* 左重右轻 */ else if (sign == '>') { total++; for (i = 0; i < p; i++) { w[t[i]]++; } for (i = p; i < 2 * p; i++) { w[t[i]]--; } } } /* 假币在不等式中每次都应该出现 */ for (i = 1; i <= n; i++) { if (r[i]) { continue; } /* 找出每次都出现的"假币" */ if (w[i] == total || w[i] == - total) { count++; pos = i; } } /* 假币唯一则输出 */ if (count != 1) { printf("0\n"); } else { printf("%d\n",pos); } return 0; }