#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int flg[1001];//标记硬币:0:初始状态;1:可疑的;2:正常的硬币
int comp[100][1001];//存放比较过程
char res[100];//存放比较结果
int sumArray(int *arr,int start,int end,int fal,int value)//fal为有问题的硬币,及其对应价值
{
int sum = 0;
for(int i = start; i <= end; ++i)
if(arr[i] != fal)
sum += 2;//正常的硬币价值为2
else
sum += value;
return sum;
}
int main()
{
freopen("in.txt","r",stdin);
memset(flg,0,sizeof(int)*1001);
int N,//2 <= N <= 1000
K;//1 <= K <= 100
int index = 0;
cin>>N>>K;
while(K--)
{
cin>>comp[index][0];
for(int i = 1; i <= 2*comp[index][0]; ++i)
{
cin>>comp[index][i];
if(flg[comp[index][i]] != 2)
flg[comp[index][i]] = 1;
}
cin>>res[index];
if(res[index] == '=')
{
for(int i = 1; i <= 2*comp[index][0]; ++i)
flg[comp[index][i]] = 2;
}
++index;
}
int i,j,k;
int left,right;
int fcoin = -1;//记录fcoin
char ch;
for(i = 1; i <= N; ++i)
{
if(flg[i] == 1)
{
for(j=1; j<=3; j+=2)//问题硬币的可能价值为1,3
{
for(k=0; k<index; ++k)
{
left = sumArray(comp[k],1,comp[k][0],i,j);
right = sumArray(comp[k],comp[k][0]+1,2*comp[k][0],i,j);
if(left < right)
ch = '<';
else if(left == right)
ch = '=';
else
ch = '>';
if(ch != res[k])
break;
}
if(k == index)
{
if(fcoin == -1)
fcoin = i;
else//多种符合所有情况的硬币
{
fcoin = -2;
goto END;
}
}
}
}
}
END:if(fcoin > 0)
cout<<fcoin<<endl;
else if(fcoin == -2)
cout<<0<<endl;
else if(fcoin == -1)//特殊情况,即N个数中,确定有N-1个数没有问题,那么最后一个硬币是faulty
{
int count = 0,t;
for(int i=1; i <= N; ++i)
if(flg[i] == 0)
{
++count;
t = i;
}
if(count == 1)
cout<<t<<endl;
else
cout<<0<<endl;
}
}
测试数据:
5 2
1 2 3
=
1 1 4
=
5 3
2 1 2 3 4
>
1 1 4
=
1 2 5
=
2 2
1 1 2
<
1 2 1
>
5 3
2 1 2 3 4
>
1 1 4
=
1 2 5
=