Counterfeit Dollar POJ - 1013

首先请允许我骂一顿杀千刀的hoj( g20) ,我找点题目容易么。

 然后,欢迎大家逃离大帅的世界,这儿的题目容易得很。
  题目来咯:
  思远宝宝有一打银币( 一打有几个你知道么)。然而,其中有一个是伪造的(不知道是偏重还是偏轻),现在思远有三次机会进行天平称重,并且保证三次后有解,请你找出伪造银币并告诉我是偏重还是偏轻。
Input
 
第一行n(n>0)代表有几个样例。每个样例都包括三行输入。我们把一打银币映射到大写字母A--L。每一行包括三个string, 表示左盘,右盘和右盘的平衡状况(up,down,even) 。放入左盘和右盘的银币一定一样多。
Output
对于每个样例,我们保证有解,请输出哪个硬币是伪造的并且输出偏重还是偏轻(light heavy)。
Sample Input
1 
EFGH ABCD even 
EFGI ABCI  even 
ABEF CDFK up
Sample Output
K is the counterfeit coin and it is light. 

因为只有一个假币,所以当重量为even时,只有左右不存在相同那么这个字符就是真的,用一个数组来标记,当他是up或者dow时,则被列入怀疑行列,怀疑次数越多,是假币的可能性越大


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

int main()
{
    int n,len;
    int book[12]={0},flag[4][12];//分别表示被怀疑的次数和是否一定为假币
    char l[3][10],r[3][10],tmp[5];
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        memset(flag,0,sizeof(flag));
        memset(book,0,sizeof(book));//务必记得初始化
        for(int i=0;i<3;i++)
        {
            scanf("%s%s%s",l[i],r[i],tmp);//字符串是以空格或回车结尾的
            len=strlen(l[i]);
            if(strcmp(tmp,"even")==0)
            {
                for(int j=0;j<len;j++)
                {
                    flag[i][l[i][j]-'A']=1;
                }
                for(int j=0;j<len;j++)
                {
                    if(flag[i][r[i][j]-'A']==1)//避免左右相同带来的影响
                        flag[i][r[i][j]-'A']=0;
                    else
                        flag[i][r[i][j]-'A']=1;
                }
            }
            if(strcmp(tmp,"up")==0)
            {
                for(int j=0;j<len;j++)
                {
                    book[l[i][j]-'A']++;
                    book[r[i][j]-'A']--;
                }
            }
            if(strcmp(tmp,"down")==0)
            {
                for(int j=0;j<len;j++)
                {
                    book[l[i][j]-'A']--;
                    book[r[i][j]-'A']++;
                }
            }
        }
        for(int i=0;i<12;i++)
        {
            flag[3][i]=flag[0][i]||flag[1][i]||flag[2][i];
        }
        int maxx=-1,j=0;
        for(int i=0;i<12;i++)
        {
            if(flag[3][i]==1)
                continue;
            if(abs(book[i])>=maxx)
            {
                maxx=abs(book[i]);
                j=i;
            }
        }
        if(book[j]>0)
        {
            printf("%c is the counterfeit coin and it is heavy.\n",'A'+j);
        }
        else
        {
            printf("%c is the counterfeit coin and it is light.\n",'A'+j);
        }

    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值