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