题意:一堆硬币(N个) 中有一个假币,假币质量与其他硬币质量不同(更重或更轻),通过K次称重得到的结果来判断假币的序号。
首先给出两个整数 N 和 K ,表示有N个硬币,K次称重。
然后2K行
每两行代表一次称重。
1. =
等号两边的硬币都是正常硬币
2.<或>
同时处于偏重和偏轻端的硬币正常。
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
int n,k,p,i,j,mark;
int flag[1001],t1[501],t2[501],temp[1001];
bool less[1001],more[1001];
char ch[10];
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(flag,-1,sizeof(flag));
memset(less,0,sizeof(less));
memset(more,0,sizeof(more));
for(i=1;i<=k;i++)
{
scanf("%d",&p);
for(j=1;j<=p;j++) scanf("%d",&t1[j]);
for(j=1;j<=p;j++) scanf("%d",&t2[j]);
scanf("%s",ch);
if(ch[0]=='=') for(j=1;j<=p;j++) flag[t1[j]]=0,flag[t2[j]]=0;
else
{
memset(temp,0,sizeof(temp));
for(j=1;j<=p;j++) //出现在不等式的数字都有嫌疑,所以令temp==0的i正常
{
temp[t1[j]]=1;
temp[t2[j]]=1;
}
if(ch[0]=='>')
{
for(j=1;j<=p;j++) more[t1[j]]=1;
for(j=1;j<=p;j++) less[t2[j]]=1;
}
else
{
for(j=1;j<=p;j++) less[t1[j]]=1;
for(j=1;j<=p;j++) more[t2[j]]=1;
}
for(j=1;j<=n;j++)
{
if(!temp[j]) flag[j]=0;
if(more[j]&&less[j]) flag[j]=0;
}
}
}
// for(i=1;i<=n;i++)
// printf("%d ",less[i]);printf("\n");
// for(i=1;i<=n;i++)
// printf("%d ",more[i]);printf("\n");
// for(i=1;i<=n;i++)
// printf("%d ",flag[i]);printf("\n");
for(mark=0,i=1;i<=n;i++)
if(flag[i]==-1)
{
if(mark!=0)
{
mark=0;
break;
}
else
mark=i;
}
printf("%d\n",mark);
}
return 0;
}

本文介绍了一个用于确定一组硬币中哪一个是假币的算法。该算法通过多次称重比较硬币重量,并根据称重结果缩小可疑硬币范围,最终找出假币。涉及核心数据结构与算法实现。
425





