poj 1028 False coin

题目链接:点击打开链接


题意: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;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值