参考了slayer 的解答http://www.slyar.com/blog/poj-1029-cpp.html 与POJ 1013类比
模拟题,抓两点,其一在等式中出现的硬币一定不是假币,其二在不等式中每次都出现即在不等式中出现的次数等于它出现的次数,一定是假币
其他情况无法判断输出0
#include <iostream> #include <string> using namespace std; const int MAX = 1001; int main(){ int i,n,k,p,count,pos,total = 0;//total标记不等式出现的次数,不等式中假币一定都出现 char sign; int t[MAX] = {0};//记录称量的原始数据 int r[MAX] = {0};//标记硬币真假 int w[MAX] = {0};//标记硬币重量 cin>>n>>k; while (k--) { cin>>p; for ( i = 0;i < 2*p;i++) cin>>t[i]; cin>>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]]--; } } count = 0,pos = 0; for (i = 1;i <= n;i++)//注意硬币从1开始标号 { if (r[i]) { continue; } if (w[i] == total || w[i] == -total) { pos = i; count++; } } if (count != 1) { cout<<0<<endl; } else cout<<pos<<endl; return 0; }