转自: 点击打开链接
/*
功能Function Description: POJ-1013 Counterfeit Dollar 策略问题
开发环境Environment: DEV C++ 4.9.9.1
技术特点Technique:
版本Version:
作者Author: 可笑痴狂
日期Date: 20120726
备注Notes:
由于该题必然有确定的判定,所以简单的可以这么想:
设置一个标记数组,每次称球的时候,如果是"even"则把对应的设置为"真东西",即置为10,
如果是"up"或"donw" 则把未分辨出真假的硬币中flag数组中对应的 ++ 或者 --,直到最后。那么操作之后,
flag中存在没有辨认出真的,就是一系列的例如: -1,-2,1,2,3等数值,那么
假东西就是其中绝对值最大的那个!!------被怀疑次数最多,所以它为假。
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int n,k,i,t,len,max;
char s1[13],s2[13],temp[10];
int flag[12];
scanf("%d",&n);
while(n--)
{
memset(flag,0,sizeof(flag));
for(t=1;t<=3;++t)
{
scanf("%s%s%s",s1,s2,temp);
len=strlen(s1); //两边个数肯定相等,所以两边长度也一样
if(strcmp(temp,"even")==0)
{
for(i=0;i<len;++i)
{
flag[s1[i]-'A']=10; //说明两边都为真,将标记数组置为10
flag[s2[i]-'A']=10;
}
}
else if(strcmp(temp,"up")==0)//说明左边重
{
for(i=0;i<len;++i)
{
if(flag[s1[i]-'A']!=10)
++flag[s1[i]-'A']; //左边加一
if(flag[s2[i]-'A']!=10)
--flag[s2[i]-'A']; //右边减一
}
}
else
{
for(i=0;i<len;++i) //说明右边重
{
if(flag[s1[i]-'A']!=10)
--flag[s1[i]-'A']; //左边减一
if(flag[s2[i]-'A']!=10)
++flag[s2[i]-'A']; //右边加一
}
}
}
max=0;
k=0;
for(i=0;i<12;++i)
{
if(flag[i]==10)
continue;
if(max<=abs(flag[i]))
{
max=abs(flag[i]);
k=i;
}
}
if(flag[k]>0)
printf("%c is the counterfeit coin and it is heavy.\n",'A'+k);
else
printf("%c is the counterfeit coin and it is light.\n",'A'+k);
}
return 0;
}