题目大意:给出n个硬币(真币和假币质量不同),和k次比较。每次比较去p个硬币置于天平左盘,p个至于右盘,先给出每次比较的硬币编号和比较结果,要求找出假币的编号。找不到就输出“0”


解题思路:根据题意可以知道一下几点:
              1)每次出现"=",一定是真币
              2)真币一定不会出现在不等式中
              3)如果假币唯一则一定出现在每一次不等式中。       
              4)因为不知道假币是比真币重还是轻,但是不管是轻还是重,它都只会出现在不等式小的一边(或者大的一边)

               基于上面几点:我们可以将=号左右出现的真币先排除,然后统一大于小于号,统计硬币在重的一方,轻的一方出现的次数。
               如果存在且仅存在一个硬币在不等号一个方向出现的次数等于不等式出现的次数,那个硬币就一定是假币。
         
               *_*。。。。。。在写这道程序之前写了一道多达150行的按操作模拟的程序,虽然A了,但是看起来好恶心!!

代码: 
 1#include <iostream>
 2#include <string>
 3#include <cmath>
 4#include <cstring>
 5#include <algorithm>
 6
 7using namespace std;
 8
 9const int MAX=1001;
10
11int n,k,p,total=0;
12char temp;
13int a[MAX]={0};
14int r[MAX]={0};
15int times[MAX]={0};
16
17int main()
18{
19    cin >> n >> k;
20    while (k--)
21    {
22        cin >> p;
23        for (int i=0; i<2*p; i++)
24        {
25            cin >> a[i];
26        }

27        cin >> temp;
28        if (temp=='=')
29        {
30            for (int i=0; i<2*p; i++)
31            {
32                r[a[i]]=1;
33            }

34        }

35        if (temp=='<')
36        {
37            total++;
38            for (int i=0; i<p; i++)
39            {
40                times[a[i]]--;
41            }

42            for (int i = p; i<2*p; i++)
43            {
44                times[a[i]]++;
45            }

46        }

47        if (temp=='>')
48        {
49            total++;
50            for (int i=0; i<p; i++)
51            {
52                times[a[i]]++;
53            }

54            for (int i=p; i<2*p; i++)
55            {
56                times[a[i]]--;
57            }

58        }

59    }

60    int cnt=0,s=0;
61    for (int i= 1; i<=n; i++)
62    {
63        if (r[i]!=1)
64            if (times[i]==total || times[i]==-total)
65            {
66                cnt++;
67                s=i;
68            }

69    }

70    if (cnt==1) cout << s << endl;
71    else  cout << 0 << endl;
72    return 0;
73}

74