POJ 1013

本文介绍了一种通过三次称重找出12个硬币中唯一一个假硬币的方法,并判断其是轻还是重。利用布尔数组记录真实硬币,整型数组记录每个硬币被怀疑的程度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于该题必然有确定的判定,所以简单的可以这么想:

设置两个数组: real[12]-标志为真   lh[12]--标志被怀疑
每次称球的时候,如果是"even"则把对应的设置为"真东西",即置为1,
如果是"up"或"donw" 则把表示轻重的数组lh对应的 ++ 或者 --,直到最后。

然后把所有对应real中为1(即就是真东西啦)的lh置为0;那么操作之后,
lh中存在没有辨认出真的,就是一系列的例如: -1,-2,1,2,3等数值,那么
假东西就是其中绝对值最大的那个!!------被怀疑次数最多,所以它为假。
#include<stdio.h>
#include<string.h>
#include<math.h>

char s1[30];
char s2[30];
char str[30];
bool v[30];
int num[30];

int main()
{
	int cas;
	int i,j,max;
	int k;
	int ans;
	scanf("%d%*c",&cas);
	while(cas--)
	{
		memset(v,false,sizeof(v));
		memset(num,0,sizeof(num));
		
		for(i=0;i<3;i++)
		{
			memset(s1,0,sizeof(s1));
			memset(s2,0,sizeof(s2));
			memset(str,0,sizeof(str));
			scanf("%s",s1);
			scanf("%s",s2);
			scanf("%s",str);
			if(strcmp(str,"even")==0)
			{	
				for(j=0;s1[j]!='\0';j++)
					v[s1[j]-'A']=true;
				for(j=0;s2[j]!='\0';j++)
					v[s2[j]-'A']=true;
			}
			else if(strcmp(str,"up")==0)
			{
				for(j=0;s1[j]!='\0';j++)
					num[s1[j]-'A']++;
				for(j=0;s2[j]!='\0';j++)
					num[s2[j]-'A']--;
			}
			else if(strcmp(str,"down")==0)
			{
				for(j=0;s1[j]!='\0';j++)
					num[s1[j]-'A']--;
				for(j=0;s2[j]!='\0';j++)
					num[s2[j]-'A']++;
			}
		}
		max=-1;
		for(i=0;i<12;i++)
			if(abs(num[i])>max&&v[i]==false)
			{
				max=abs(num[i]);
				k=i;
			}
		if(num[k]>0)
			printf("%c is the counterfeit coin and it is heavy.\n",k+'A');
		else if(num[k]<0)
			printf("%c is the counterfeit coin and it is light.\n",k+'A');	
	}
	return 0;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值