[原创]我的PKU ACM POJ1029题解
这题和POJ1013几乎相同,碰到了也厚颜无耻的再做了一遍来充数。^_^
Source Code
Problem: 1029 | User: absolute | |
Memory: 212K | Time: 16MS | |
Language: C++ | Result: Accepted |
- Source Code
#include <stdio.h>
int main()
{
int N,K,i,j;
bool real[1000]={0};
int heavy[1000]={0},light[1000]={0};
scanf("%d %d",&N,&K);
for(i=0;i<K;i++)
{
int pancoins,leftcoins[500],rightcoins[500];
char result;
scanf("%d",&pancoins);
for(j=0;j<pancoins;j++)
{
scanf("%d",leftcoins+j);
}
for(j=0;j<pancoins;j++)
{
scanf("%d",rightcoins+j);
}
getchar();
scanf("%c",&result);
getchar();
//平衡则放入真数组,表示这次称的都是真币
if(result=='=')
{
for(j=0;j<pancoins;j++)
{
real[leftcoins[j]-1]=true;
real[rightcoins[j]-1]=true;
}
}
//右边下降,左边怀疑为轻,右边为重
else if(result=='<')
{
for(j=0;j<pancoins;j++)
{
light[leftcoins[j]-1]++;
heavy[rightcoins[j]-1]++;
}
}
//左边怀疑为重,右边怀疑为轻
else if(result=='>')
{
for(j=0;j<pancoins;j++)
{
heavy[leftcoins[j]-1]++;
light[rightcoins[j]-1]++;
}
}
}
bool sure=true;
int falsecoin=0,unreal;
int times=0;
int realnums=0;
//假币必然是不在真数组中,而且它必然只能在重数组和轻数组之一出现,而不能同时出现
//但是有可能被怀疑的只称过一次,所以必须选出被怀疑最多次的那个
//如果有两个以上相同最多次的则无法确定
for(j=0;j<N;j++)
{
if(real[j]==true)
{
realnums++;
continue;
}
unreal = j+1;
if(light[j]>0&&heavy[j]==0)
{
if(light[j]==times)
sure = false;
else if(light[j]>times)
{
falsecoin = j+1;
sure = true;
times = light[j];
}
}
else if(light[j]==0&&heavy[j]>0)
{
if(heavy[j]==times)
sure = false;
else if(heavy[j]>times)
{
falsecoin = j+1;
sure = true;
times = heavy[j];
}
}
}
//只有一个没有称的是假币
if(realnums==N-1)
{
falsecoin = unreal;
}
if(sure)
printf("%d\n",falsecoin);
else
printf("0\n");
return 0;
}