1 ABCD EFGH even ABCI EFJK up ABIJ EFGH even
K is the counterfeit coin and it is light.
思路:如果平衡,两边的肯定都是真的。如果不平衡,重的一边就都加一,轻的一边就都减一。最后再在不一定是真的硬币中找到偏离0最大的值就是假的。(思路来自学长http://blog.csdn.net/t1019256391/article/ )
#include <string.h>
#include <stdio.h>
#include <math.h>
bool ok[12];//1表示肯定是真的
int a[12];
int main()
{
int n,i,k;
char s[3][10];
scanf("%d",&n);
while(n--)
{
memset(ok,0,sizeof(ok));
memset(a,0,sizeof(a));
for(k=0;k<3;k++)
{
for(i=0;i<3;i++) scanf("%s",s[i]);
if(s[2][0]==‘e‘)//平衡的肯定是真的
{
for(i=0;i<strlen(s[0]);i++) ok[s[0][i]-‘A‘]=1;
for(i=0;i<strlen(s[1]);i++) ok[s[1][i]-‘A‘]=1;
}
else if(s[2][0]==‘u‘)//轻的一边都减1,重的一边都加1
{
for(i=0;i<strlen(s[0]);i++) a[s[0][i]-‘A‘]++;
for(i=0;i<strlen(s[1]);i++) a[s[1][i]-‘A‘]--;
}
else if(s[2][0]==‘d‘)//轻的一边都减1,重的一边都加1
{
for(i=0;i<strlen(s[0]);i++) a[s[0][i]-‘A‘]--;
for(i=0;i<strlen(s[1]);i++) a[s[1][i]-‘A‘]++;
}
}
int max=0;
int index;
for(i=0;i<12;i++)
{
if(!ok[i] && fabs(a[i])>max)
{
max=fabs(a[i]);
index=i;
}
}
if(a[index]>0) printf("%c is the counterfeit coin and it is heavy.\n",‘A‘+index);
else printf("%c is the counterfeit coin and it is light.\n",‘A‘+index);
}
}
HDU-1482-Counterfeit Dollar,布布扣,bubuko.com
原文:http://blog.csdn.net/faithdmc/article/details/19969519