思路:
设硬币有三种状态 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; }