#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
=