poj1013

题目大意:假造的银币
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;
}

你可能感兴趣的:(poj)