POJ 1013 Counterfeit Dollar

 题意: Sally Jones 有12个银币,但只有11个是真的,其中一个假的与真银币重量不同。他用对这些银币称量三次,给出每次称量的结果以及称量的硬币编号。问那个硬币是假的。


分析:用一个数组记录每次的称量结果(初值0),如果不平衡,就对可能轻的一边的所有银币进行-1(表示被怀疑一次),对可能重的一边进行+1(表示被怀疑一次).最后被怀疑次数最多的一定就是假的了。

 

Source Code:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--){
        char left[3][7],right[3][7],sta[3][7];
        int time['L'+1]={0};
        bool zero['L'+1]={false};
        for(int i=0;i<3;i++)
            scanf("%s %s %s",left[i],right[i],sta[i]);
        for(int i=0;i<3;i++){
            switch(sta[i][0]){
                case 'u':{
                    for(int j=0;left[i][j];j++){
                        time[left[i][j]]++;
                        time[right[i][j]]--;
                    }
                    break;
                }
                case 'd':{
                    for(int j=0;left[i][j];j++){
                        time[left[i][j]]--;
                        time[right[i][j]]++;
                    }
                    break;
                }
                case 'e':{
                    for(int j=0;left[i][j];j++){
                        zero[left[i][j]]=true;
                        zero[right[i][j]]=true;
                    }
                    break;
                }
            }
        }
        int ma=-1;
        char c;
        for(int i='A';i<='L';i++){
            if(zero[i]) continue;
            if(ma<abs(time[i])){
                ma=abs(time[i]);
                c=i;
            }
        }
        printf("%c is the counterfeit coin and it is ",c);
        if(time[c]>0) printf("heavy.\n");
        else          printf("light.\n");
    }
    return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值