acwing3436. 假币

【题目】

        

萨莉·琼斯有一打旅行者银元硬币(一打指十二个)。

其中的十一个硬币是真币,还有一个是假币。

假币的颜色和大小与真币并无差别,但是重量上与真币不同。

遗憾的是,萨莉并不清楚假币是更重还是更轻。

幸好,她的朋友借给了她一个非常精准的天平。

朋友允许她进行三次称重,来找到假币的存在。

举例说明,如果她将两个硬币放置在天平两端,天平保持平衡,则说明两个硬币都是真的。

然后用一个真币和第三个硬币称重比较,如果天平不平衡,则确定第三个硬币是假币,并且根据天平的高低,也可判断假币是更轻还是更重。

通过合理安排,她确定可以通过三次称重找到假币的存在。

输入格式
共三行,每行描述一次称重。用大写字母 A∼L
 对 12
 个硬币分别标号,用天平右端的倾斜程度来描述称重结果。

每行首先包含两个大写字母构成的字符串,分别表示左右两端的硬币(两端的硬币数量一定相同),然后包含一个单词 up,down 或 even,表示天平右端的倾斜程度。

输出格式
输出占一行,格式为 XX is the counterfeit coin and it is XXX.,其中 XX 是假币的字母编号,XXX 用来形容它更轻还是更重,更轻用 light 表示,更重 heavy 表示。

数据范围
保证一定有解。

输入样例:
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
输出样例:
K is the counterfeit coin and it is light.

【解题思路】

        本题直接暴力枚举,逐个判断,对三个条件判断时使用continue和break对是否符合三个条件进行判断,思路理清就行。

【AC代码】

#include<iostream>
using namespace std;
typedef struct weight {
	string left;
	string right;
	string condition;
}weight;
int main() {
	ios::sync_with_stdio(false);
	weight w[3];
	for (int i = 0; i < 3; i++)
		cin >> w[i].left >> w[i].right >> w[i].condition;
	char x = 'A';
	for (int i = 0; i < 12; i++) {
		int u = 0;    //u用来判断每次枚举符合的条件数
		int g = 0;    //g用来判断假币轻重,1为重,-1为轻,初值为0
		for (; u < 3; u++) {
			if (w[u].condition == "even") {
				if ((w[u].left.find(x) != string::npos && w[u].right.find(x) != string::npos)
					|| (w[u].left.find(x) == string::npos && w[u].right.find(x) == string::npos))
					continue;
				else
					break;
			}
			else {
				if ((w[u].left.find(x) == string::npos && w[u].right.find(x) == string::npos)
					|| (w[u].left.find(x) != string::npos && w[u].right.find(x) != string::npos))
					break;
				if (w[u].condition == "down") {
					if (g == 0) {
						g = (w[u].left.find(x) == string::npos) ? 1 : -1;
						continue;
					}
					else if (g == -1) {
						if (w[u].left.find(x) == string::npos)
							break;
						else
							continue;
					}
					else if (g == 1) {
						if (w[u].left.find(x) == string::npos)
							continue;
						else
							break;
					}
				}
				if (w[u].condition == "up") {
					if (g == 0) {
						g = (w[u].left.find(x) == string::npos) ? -1 : 1;
					}
					else if (g == -1) {
						if (w[u].left.find(x) == string::npos)
							continue;
						else
							break;;
					}
					else if (g == 1) {
						if (w[u].left.find(x) == string::npos)
							break;
						else
							continue;
					}
				}
			}
		}
		if (u == 3) {
			string t = (g == 1) ? "heavy" : "light";
			cout << x <<" is the counterfeit coin and it is "<<t<<".";
			break;
		}
		x = char(x + 1);
	}
	return 0;
}

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值