您的位置:首页 > Web前端

POJ 1013 Counterfeit Dollar

2010-12-22 22:59 316 查看
如果称量结果为even,则每个硬币都是真的,否则,如果结果为up,将左右两边的硬币对换

对于结果不是even的称量,统计各个硬币在两边出现的次数,由于只有一个假的,则假硬币出现的次数必等于结果不是even的次数

最后遍历一边所有硬币,如果不能确定为真且某一边出现的次数等于结果不是even的次数,则它就是假的,同时,可以判断是轻的还是重的,因为数据保证3次称量必定可以找出来

代码:

#include<iostream>
using namespace std;
int True[13],lnum[13],rnum[13];
char s[10][20];
int main()
{
int i,j,ca,k,flag,cnt,ans;
char res[10],t;
cin>>ca;
while(ca--)
{
cnt=3;
memset(True,0,sizeof(True));
memset(lnum,0,sizeof(lnum));
memset(rnum,0,sizeof(rnum));
for(i=1;i<=9;i++)
{
scanf("%s",&s[i]);
if(i%3==0)
{
if(s[i][0]=='e')
{
cnt--;
for(j=0;j<strlen(s[i-1]);j++)
True[s[i-1][j]-'A'+1]=1;
for(j=0;j<strlen(s[i-2]);j++)
True[s[i-2][j]-'A'+1]=1;
}
else if(s[i][0]=='u')
{
for(j=0;j<strlen(s[i-1]);j++)
{
t=s[i-1][j];
s[i-1][j]=s[i-2][j];
s[i-2][j]=t;
}
}
}
}
for(i=3;i<=9;i+=3)
{
if(s[i][0]!='e')
{
for(j=0;j<strlen(s[i-1]);j++)
{
lnum[s[i-2][j]-'A'+1]++;
}
for(j=0;j<strlen(s[i-1]);j++)
{
rnum[s[i-1][j]-'A'+1]++;
}
}
}
for(i=1;i<=12;i++)
{
if(!True[i])
{
if(lnum[i]==cnt)
{
strcpy(res,"light");
ans=i;
break;
}
else if(rnum[i]==cnt)
{
strcpy(res,"heavy");
ans=i;
break;
}
}
}
printf("%c is the counterfeit coin and it is %s./n",ans+'A'-1,res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: