POJ 1029 硬币称量类型二 与POJ 1013类比 模拟题

参考了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; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值