直接枚举,从1到n假设其为false coin,其他coin的重量假定为0,当前coin的重量需要判断两次,分别是-1和1,-1表示比其他的轻,1表示比其他的重。
然后对所有的balance都判断一遍,若成立则ans++。
最后若ans>1则输出0,否则输出false coin。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int n,k,i,j,x;
int A[1005];
int B[101][1005];
char str[101][2];
int Blength[1005];
scanf("%d%d",&n,&k);
for (i=0;i<k;i++)
{
scanf("%d",&Blength[i]);
Blength[i]*=2;
for (j=1;j<=Blength[i];j++)
scanf("%d",&B[i][j]);
scanf("%s",str[i]);
}
int ans=0,pos;
memset(A,0,sizeof(A));
for (i=1;i<=n;i++)
{
A[i-1]=0;
A[i]=1;
bool flag=true;
bool flag2=false;
for (j=0;j<k;j++)
{
int mid=Blength[j]/2;
int left=0;
int right=0;
for (x=1;x<=mid;x++)
left+=A[B[j][x]];
for (x=mid+1;x<=Blength[j];x++)
right+=A[B[j][x]];
if (str[j][0]=='=' && left!=right)
{
flag=false;
break;
}
if (str[j][0]=='<' && left>=right)
{
flag=false;
break;
}
if (str[j][0]=='>' && left<=right)
{
flag=false;
break;
}
}
if (flag)
flag2=true;
flag=true;
A[i]=-1;
for (j=0;j<k;j++)
{
int mid=Blength[j]/2;
int left=0;
int right=0;
for (x=1;x<=mid;x++)
left+=A[B[j][x]];
for (x=mid+1;x<=Blength[j];x++)
right+=A[B[j][x]];
if (str[j][0]=='=' && left!=right)
{
flag=false;
break;
}
if (str[j][0]=='<' && left>=right)
{
flag=false;
break;
}
if (str[j][0]=='>' && left<=right)
{
flag=false;
break;
}
}
if (flag)
flag2=true;
if (flag2)
{
ans++;
pos=i;
}
}
if (ans==1)
printf("%d\n",pos);
else
printf("0\n");
return 0;
}