poj1013

时间:2023-12-06 17:01:20
题目大意:假造的银币
Sally Jones有一些游客给的银币,但是只有11枚是真正的银币(有一枚是假的),从颜色和大小是无法区分真比还是假币的,但是它的重量和真币是不同的,Sally Jones它是比真币轻还是重。
幸好的是,Sally Jones的一个朋友有个非常精确的天平,他的朋友允许Sally Jones称三次重量来寻找假币,例如,两个硬币是相同的重,那么这两个都是真的。
其实总共有12玫硬币,里面就一枚是假的,然后称量三次,找出那个假币,就是这样。
好吧,是不是可以直接用拿出一枚硬币然后判断如果这枚硬币是假的,看看能不能别的都没问题,算是暴力做法。试试吧

竟然对了,无语--

#include<stdio.h>

#include<string.h>
#define maxn 15
struct node
{
    char qian[maxn], hou[maxn];
    int k;//0代表等enen,-1代表up, 1代表down
}a[maxn];
int Judge(char x, node b, int k)
{
    if(strchr(b.qian, x))
    {
        if(k==0 && b.k==1 || k==1 && b.k==-1)
            return 1;
        return 0;
    }
    if(strchr(b.hou, x))
    {
        if(k==0 && b.k==-1 || k==1 && b.k==1)
            return 1;
        return 0;
    }
    if(b.k == 0)
        return 1;
    return 0;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int i, j, ans, k;
        char s[maxn];
        for(i=0; i<3; i++)
        {
            scanf("%s%s%s", a[i].qian, a[i].hou, s);
            if(s[0] == 'e')
                a[i].k = 0;
            else if(s[0] == 'u')
                a[i].k = -1;
            else if(s[0] == 'd')
                a[i].k = 1;
        }
        for(i=0; i<12; i++)
        {
            k=0;
            for(j=0; j<3; j++)
                if(Judge(i+'A', a[j], k) == 0)
                    break;
            if(j == 3)
                break;
            k=1;
            for(j=0; j<3; j++)
                if(Judge(i+'A', a[j], k) == 0)
                    break;
            if(j == 3)
                break;
        }
        printf("%c is the counterfeit coin and it is %s.\n", i+'A', k? "heavy" : "light");
    }
    return 0;
}

相关文章