POJ-1029简单推断题

4 篇文章 0 订阅
/*
题目大意:根据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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值