/*
题目大意:根据k个天平的称重比较结果(>,<,=)找出n枚硬币中的唯一一枚假币。
网路上找来的题目分类,这题分为了DP类,其实这是一个简单的推断题,用排除法有:
(1)出现在等式中的可排除
(2)即出现在不等式小于的一边又出现在大于的一边的可排除
(3)除(1),(2)之外的出现在不等式中次数最多的硬币为假币,次数最多的有多枚时,找不到假币
难得的1Y。。。 。。。
*/
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int NN=1002;
int n,k;
int lt[NN],gt[NN];
bool fake[NN];
int main()
{
int t,x[NN],y[NN];
char st[4];
scanf("%d%d",&n,&k);
for (int i=1; i<=n; i++)
{
fake[i]=true;
lt[i]=gt[i]=0;
}
for (int i=1; i<=k; i++)
{
scanf("%d",&t);
for (int i=1; i<=t; i++) scanf("%d",&x[i]);
for (int i=1; i<=t; i++) scanf("%d",&y[i]);
scanf("%s",st);
if (st[0]=='=')
for (int i=1; i<=t; i++) fake[x[i]]=fake[y[i]]=false; //对应(1)
else if (st[0]=='<')
{
for (int i=1; i<=t; i++) lt[x[i]]++;
for (int i=1; i<=t; i++) gt[y[i]]++;
}
else if (st[0]=='>')
{
for (int i=1; i<=t; i++) lt[y[i]]++;
for (int i=1; i<=t; i++) gt[x[i]]++;
}
}
for (int i=1; i<=n; i++) if (lt[i] && gt[i]) fake[i]=false; //对应(2)
int w1=0,w2=-1;
bool flag=false;
for (int i=1; i<=n; i++) //对应(3)
if (fake[i])
{
int ww=lt[i]? lt[i]:gt[i];
if (ww==w2) flag=true;
else if (ww>w2) { w1=i; w2=ww; flag=false; }
}
if (flag) printf("0\n");
else printf("%d\n",w1);
return 0;
}
POJ-1029简单推断题
最新推荐文章于 2020-12-01 16:40:58 发布