题目大意:
有若干个硬币,其中有一个是假币,或重,或轻。有一个天平以及若干次操作,问是否能够确定这个唯一假币。
解题思路:
因为硬币数量只有1000,操作也只有100次,所以可以直接暴力枚举假设第x枚硬币是假币,判断条件是否满足即可,当出现很多种满足条件的假币时,输出0.在处理假币的时候,假币时不可能即超重,又超轻的。
一开始,在这组数据上错了一次 3 1 1 2 = 原因是因为,我在不能确定是否是超重,或者超轻的情况下,当做真币处理了。
下面是代码。
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int n,m,i,j,t,ans,x,f;
int a[1111];
int b[111][1111];
char s[111][5];
while(scanf("%d%d",&n,&m)!=-1)
{
memset(b,0,sizeof(b));
for(i=1;i<=m;i++)
{
scanf("%d",&a[i]);
for(j=1;j<=2*a[i];j++)
{
scanf("%d",&x);
b[i][x]=j;
}
scanf("%s",s[i]);
}
t=0;
ans = 0;
//如果j是那个假币
for(j=1;j<=n;j++)
{
f = 0;
for(i=1;i<=m;i++)
{
if(b[i][j]==0)
{
if(s[i][0]=='=')continue;
else break;
}
else
{
if(s[i][0]=='=')break;
else if(s[i][0]=='>')
{
if(b[i][j]<=a[i])
{
if(f==-1)break;
f = 1;
}
else if(b[i][j]>a[i])
{
if(f==1)break;
f = -1;
}
}
else
{
if(b[i][j]>a[i])
{
if(f==-1)break;
f = 1;
}
else if(b[i][j]<=a[i])
{
if(f==1)break;
f = -1;
}
}
}
}
if(i>m)
{
t++;
ans = j;
}
}
if(t==1)printf("%d\n",ans);
else printf("0\n");
}
return 0;
}