题目链接:点击打开链接
题意:N个硬币中只有一个硬币重量与其他硬币不同,给你K次称量的结果,问你能否求出是哪枚硬币,能就输出硬币的编号。
因为这枚硬币要么更重,要么更轻,根据这两种假设分别进行模拟,最后得到根据这两种假设的结果,如果都没有结果,或者都有结果且结果不相等,则说明无法判断,否则输出有结果的那种假设的结果。
得到结果的过程是先假设所有硬币都是假的,如果出现=号则天平左右这些全部都是真的,如果是大小于号,则根据等式令天平中一边的元素变为真的,然后令没在天平中出现的元素也都是真的(开始这里wa了),最后看仍标记为假的的元素有多少,若不等于1则没有结果。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool a1[1005];
bool a2[1005];
int l[505];
int r[505];
bool lp[1005];
bool rp[1005];
int main(){
int N,K;
while(~scanf("%d%d",&N,&K)){
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
for(int j=1;j<=K;j++){
int n;char c[2];
memset(lp,0,sizeof(lp));
memset(rp,0,sizeof(rp));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&l[i]);
lp[l[i]]=1;
}
for(int i=1;i<=n;i++){
scanf("%d",&r[i]);
rp[r[i]]=1;
}
scanf("%s",c);
if(c[0]=='='){
for(int i=1;i<=N;i++){
if(lp[i]||rp[i]){
a1[i]=1;
a2[i]=1;
}
}
}
else if(c[0]=='>'){
for(int i=1;i<=N;i++){
if(!lp[i]){
a1[i]=1;
}
if(!rp[i]){
a2[i]=1;
}
}
}
else if(c[0]=='<'){
for(int i=1;i<=N;i++){
if(!lp[i]) a2[i]=1;
if(!rp[i]) a1[i]=1;
}
}
}
int flag1=0,flag2=0,res1,res2;
for(int i=1;i<=N;i++){
if(!a1[i]){
flag1++;
res1=i;
}
if(!a2[i]){
res2=i;
flag2++;
}
}
bool p1=(flag1==1);
bool p2=(flag2==1);
if(!p1&&!p2) printf("0\n");
else if(p1&&p2&&(res1!=res2)) printf("0\n");
else if(p1) printf("%d\n",res1);
else printf("%d\n",res2);
}
return 0;
}