FOJ Problem 1003 Counterfeit Dollar

题目大意是给你一打共计12枚硬币,其中一枚假冒伪劣重量有问题,其余是正常的。给你3次使用天平的机会,让你找出这枚硬币。

一开始我想了好久,打算用数组和数字加减等等分了好多种情况,觉得一道水题我想这么复杂肯定是走死胡同了,于是百度了一下别人的做法。果然图样,,,我的打算是通过每次测量两遍的总和来推断问题硬币的位置,然而我发现别人直接从一个个硬币分析轻重过去,更简洁,,,,orz

而且我发现 strchr(char a[],char x)我没见过啊,,,,学到了,,,,,原来是用来判断x出现在a[]中的位置,不在就NULL。。。。。

不说了,贴代码,说多了都是西湖水。。。。。。。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
char Left[3][7],Right[3][7],result[3][7];//分别存储天平左侧硬币,右侧硬币和结果
int is_heavy(char x){//判断是否偏重
	int i;
	for(i=0;i<3;i++){
		if(result[i][0]=='e')
			if(strchr(Left[i],x)!=NULL || strchr(Right[i],x)!=NULL) return 0;
		if(result[i][0]=='u')
			if(strchr(Left[i],x)==NULL) return 0;
		if(result[i][0]=='d')
			if(strchr(Right[i],x)==NULL) return 0;
	} 
	return 1;
} 
int is_light(char x){//判断是否偏轻
	int i;
	for(i=0;i<3;i++){
		if(result[i][0]=='e')
			if(strchr(Left[i],x)!=NULL || strchr(Right[i],x)!=NULL) return 0;
		if(result[i][0]=='u')
			if(strchr(Right[i],x)==NULL) return 0;
		if(result[i][0]=='d')
			if(strchr(Left[i],x)==NULL) return 0;
	} 
	return 1;
} 
int main(){
	int i,n;
	char x;
	cin>>n;
	while(n--){
		for(i=0;i<3;i++){
			scanf("%s %s %s",Left[i],Right[i],result[i]);
		}
		for(x='A';x<='L';x++){
			if(is_light(x)){
				printf("%c is the counterfeit coin and it is light.\n",x);
				break;
			}
			if(is_heavy(x)){
				printf("%c is the counterfeit coin and it is heavy.\n",x);
				break;
			}
		}
	}
	 
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值