直接枚举,从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; }