Link:http://acm.fzu.edu.cn/problem.php?pid=1003
Accept: 1107 Submit: 4860
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Sally Jones has a dozen Voyageur silver dollars. However, only eleven of the coins are true silver dollars; one coin is counterfeit even though its color and size make it indistinguishable from the real silver dollars. The counterfeit coin has a different weight from the other coins but Sally does not know if it is heavier or lighter than the real coins.
Happily, Sally has a friend who loans her a very accurate balance scale. The friend will permit Sally three weighings to find the counterfeit coin. For instance, if Sally weighs two coins against each other and the scales balance then she knows these two coins are true. Now if Sally weighs one of the true coins against a third coin and the scales do not balance then Sally knows the third coin is counterfeit and she can tell whether it is light or heavy depending on whether the balance on which it is placed goes up or down, respectively.
By choosing her weighings carefully, Sally is able to ensure that she will find the counterfeit coin with exactly three weighings.
Input
Output
Sample Input
Sample Output
//有12个硬币,其中一个不正常,现在要求通过3次测量,找出这个硬币,并且确定这个硬币是比较重的还是比较轻的
/*
**状态:
**0.正常 1.重 2.不确定 -1.轻
**隐含条件:
**1.两边的硬币个数要相等
**2.右边的比较轻时,可能要找的硬币在右边,且比较轻;或者在左边,且比较重
**3.当出现不相等的情况时,剩余的硬币都是正常的
*/
AC code:
#include <stdio.h>
#include <string.h>
#define OneSideMax 6 //一边硬币的最大数
#define CoinMax 12 //最大的硬币个数
#define StatusLen 4 //up,down,even的最大长度
char left[OneSideMax+1]; //左边硬币
char right[OneSideMax+1];
char status[StatusLen+1];
int coin[CoinMax+1]; //对应硬币的状态
void MarkNormal(const char *str,int len)
{
int i;
for(i=0;i<len;i++)
coin[str[i]-'A']=0;
}
void MarkLight(const char *str,int len)
{
int i;
for(i=0;i<len;i++)
{
if(2==coin[str[i]-'A']) //硬币状态不确定
coin[str[i]-'A']=-1;
if(1==coin[str[i]-'A']) //硬币以前可能比较重,现在比较轻,所以只能硬币是正常的
coin[str[i]-'A']=0;
}
}
void MarkHeavy(const char *str,int len)
{
int i;
for(i=0;i<len;i++)
{
if(2==coin[str[i]-'A'])
coin[str[i]-'A']=1;
if(-1==coin[str[i]-'A'])
coin[str[i]-'A']=0;
}
}
void MarkRemainNormal(const char *str1,const char *str2,int len)
{
int i;
int temp[CoinMax+1];
for(i=0;i<len;i++)
{
temp[str1[i]-'A']=1;
temp[str2[i]-'A']=1;
}
for(i=0;i<CoinMax;i++)
{
if(1!=temp[i])
coin[i]=0;
}
}
int main()
{
int t;
int len;
int i;
scanf("%d",&t);
while(t--)
{
for(i=0;i<CoinMax;i++)
coin[i]=2;
for(i=0;i<3;i++)
{
memset(left,'\0',sizeof(left));
memset(right,'\0',sizeof(right));
memset(status,'\0',sizeof(status));
scanf("%s%s%s",left,right,status);
len = strlen(left);//左边的等于右边
if('e'==status[0])
{
MarkNormal(left,len);
MarkNormal(right,len);
}
else if('u'==status[0]) //右边轻
{
MarkLight(right,len);
MarkHeavy(left,len);
MarkRemainNormal(left,right,len);
}
else //右边重
{
MarkLight(left,len);
MarkHeavy(right,len);
MarkRemainNormal(left,right,len);
}
}
for(i=0;i<CoinMax;i++)
if(coin[i]!=0)
break;
if(-1==coin[i])
{
printf("%c is the counterfeit coin and it is light.\n",i+'A');
}
else
{
printf("%c is the counterfeit coin and it is heavy.\n",i+'A');
}
}
return 0;
}