这道题,我自己的代码跟人家的比起来明显啰嗦的多,又懒得再写一遍了,特转载过来提醒自己。
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;
}