思路:
设硬币有三种状态 0(正常) 1(超重) -1(低重) ,初始都设置成2
因为只有一个硬币是错误的,说明只要发现不平衡,那个硬币就在这左右两组中,其他的都是正确的
1.当<时,说明左边轻,右边重,左边都设成低重,右边都设成超重,其他硬币都是正确的
2.当>时,说明左边重,右边轻,左边都设成超重,右边都设成低重,其他硬币都是正确的
如果一个硬币既超重又低重,则为正常硬币
3.当=时,说明两个硬币都是正确的。
*如果不唯一的错误,说明无法判断 *
#include<iostream>
#include<string>
using namespace std;
const int maxn=1001;
char op;
int w[maxn],t[maxn],n,k,m;
void init(){
for(int i=0;i<maxn;i++)w[i]=2;
}
int main(){
cin>>n>>k;
init();
for(int i=0;i<k;i++){
cin>>m;
for(int j=0;j<2*m;j++){
cin>>t[j];
}cin>>op;
if(op=='='){
for(int j=0;j<2*m;j++){
w[t[j]]=0;//设置为正常
}
}else if(op=='<'){
for(int j=1;j<=n;j++){
bool flag=false;
for(int k=0;k<2*m;k++){
if(j==t[k]&&k<m){ //左边轻的
if(w[j]==1)w[j]=0;
else if(w[j]==2)w[j]=-1;
flag=true;break;
}else if(j==t[k]&&k>=m){//右边重的
if(w[j]==-1)w[j]=0;
else if(w[j]==2)w[j]=1;
flag=true;break;
}
}
if(!flag)w[j]=0; //其他都设置成正常
}
}else if(op=='>'){
for(int j=1;j<=n;j++){
bool flag=false;
for(int k=0;k<2*m;k++){
if(j==t[k]&&k<m){ //左边重的
if(w[j]==-1)w[j]=0;
else if(w[j]==2)w[j]=1;
flag=true;break;
}else if(j==t[k]&&k>=m){//右边轻的
if(w[j]==1)w[j]=0;
else if(w[j]==2)w[j]=-1;
flag=true;break;
}
}
if(!flag)w[j]=0;//其他都设置成正常
}
}
}int res,sum=0;
for(int i=1;i<=n;i++){
if(w[i]!=0){
res=i;sum++;
}
}
//cout<<"sum:"<<sum<<endl;
if(sum==1)cout<<res<<endl;
else cout<<0<<endl;
return 0;
} 


京公网安备 11010502036488号