POJ1013称硬币【枚举】

Counterfeit Dollar

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 52474   Accepted: 16402

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

The
first line of input is an integer n (n > 0) specifying the number of
cases to follow. Each case consists of three lines of input, one for
each weighing. Sally has identified each of the coins with the letters
A--L. Information on a weighing will be given by two strings of letters
and then one of the words ``up‘‘, ``down‘‘, or ``even‘‘. The first
string of letters will represent the coins on the left balance; the
second string, the coins on the right balance. (Sally will always place
the same number of coins on the right balance as on the left balance.)
The word in the third position will tell whether the right side of the
balance goes up, down, or remains even.

Output

For
each case, the output will identify the counterfeit coin by its letter
and tell whether it is heavy or light. The solution will always be
uniquely determined.

Sample Input

1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even 

Sample Output

K is the counterfeit coin and it is light. 

Source

East Central North America 1998

大概意思就是有12枚硬币从A到L,其中有一枚是假币,但是不知道轻重。称了三次,每次给定左边硬币和右边硬币以及右边天秤的情况,三次称量一定会确定一枚假币,问哪个硬币是假的并说明假币轻了还是重了。

思路:把十二枚硬币的情况都枚举一遍,一枚硬币如果是假币会有是轻假币还是重假币的情况,都需要枚举出来。从A到L依次假设为假币,看是否符合三次称量,因为只有一个假币,所以肯定只有一个硬币是假币时,才会满足给出的三次测量的情形。

#include<iostream>
#include<string.h>
using namespace std;
char cleft[3][7];//一共12个硬币,每次一边最多6个
char cright[3][7];
char result[3][7];
int num;
bool isFake(char c,bool heavy);//不加括号体
int main()
{

	cin >> num;
	while(num-- !=0)
	{
		for(int i = 0;i<3;i++)
		{
			cin >> cleft[i] >>cright[i]>>result[i];
		}
		for(char i = ‘A‘;i<=‘L‘;++i)
		{
			if(isFake(i,true))
			{
				cout <<i<<" is the counterfeit coin and it is heavy. "<<endl;
				break;
			}
			else if(isFake(i,false))
			{
				cout <<i<<" is the counterfeit coin and it is light. "<<endl;
				break;
			}
		}
	}
	return 0;
}

bool isFake(char c,bool heavy)
{
	for(int i = 0;i<3;++i)
	{
		switch(result[i][0])
		{
			case ‘u‘:
				if(heavy == true && strchr(cleft[i],c)==NULL )//重 假币肯定在左边
						return false;
				if(heavy == false && strchr(cright[i],c)==NULL )//轻 假币肯定在右边
						return false;
				break;
			case ‘d‘:
				if(heavy == true && strchr(cright[i],c)==NULL )//假币肯定在右边,并且重
						return false;
				if(heavy == false && strchr(cleft[i],c)==NULL )//假币肯定在左边,并且轻
						return false;
				break;
			case ‘e‘:
				if(strchr(cleft[i],c)!=NULL || strchr(cright[i],c)!=NULL  )//假币不在两边
						return false;
				break;
		}
	}
	return true;
}

strchr语法:
  #include <string.h>
  char *strchr( const char *str, int ch );
功能:函数返回一个指向str 中ch 首次出现的位置,当没有在str 中找ch到返回NULL。

原文地址:https://www.cnblogs.com/knmxx/p/10308264.html

时间: 2024-10-27 19:52:56

POJ1013称硬币【枚举】的相关文章

(枚举)称硬币

题3: POJ1013 称硬币有12枚硬币.其中有11枚真币和1枚假币.假币和真币重量不同,但不知道假币比真币轻还是重.现在,用一架天平称了这些币三次,告诉你称的结果,请你.找出假币并且确定假币是轻是重(数据保证一定能找出来). 输入样例1注意:天平左右的硬币数总是相等的ABCD EFGH evenABCI EFJK upABIJ EFGH even输出样例K is the counterfeit coin and it is light. 题解: 原文地址:https://www.cnblog

【算法系列之枚举】称硬币

题目 有12枚硬币.其中有11枚真币和1枚假币.假币和真 币重量不同,但不知道假币比真币轻还是重.现在, 用一架天平称了这些币三次,告诉你称的结果,请你 找出假币并且确定假币是轻是重(数据保证一定能找 出来). 输入 第一行是测试数据组数. 每组数据有三行,每行表示一次称量的结果.银币标号 为A-L.每次称量的结果用三个以空格隔开的字符串表示: 天平左边放置的硬币 天平右边放置的硬币 平衡状态.其 中平衡状态用``up'', ``down'', 或 ``even''表示, 分 别为右端高.右端低

算法基础_枚举

枚举:基于逐个尝试答案的一种文体求解策略 1. 完美立方 题目描述: 形如a^3= b^3 + c^3 + d^3的等式被称为完美立方等式.例如 12^3= 6^3 + 8^3 + 10^3 .编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a^3 = b^3 + c^3 + d^3,其中a,b,c,d 大于1 , 小于等于N,且b<=c<=d. 输入 一个正整数N (N≤100). 输出 每行输出一个完美立方.输出格式为: Cube = a, T

常见算法和例题

第3章  算法与程序设计模块 3.1  算    法 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作. 常用的算法:列举了穷举搜索.递归.回溯.递推.模拟.分治.贪心.深度优先搜索.广度优先搜索等几种较为常用的算法,没有做过多的描述,一旦给出具体描述,容易使内容加深,产生严重学科取向的引导,符合教育部普通高中课程方案的特点,对于这些必需的方法和思想,关键不在于学生能不能,而在于教师是否想到,是否有过关注,引发学生对系统方法和思想的思考,重视建立编程思想,

【转载】POJ水题大集合

POJ水题大集合 poj1000:A+B problempoj1002:电话上按键对应着数字.现在给n个电话,求排序.相同的归一类poj1003:求最小的n让1+1/2+1/3+...+1/n大于给的一个实数poj1004:求一堆实数的平均数poj1005:由坐标 (0,0) 开始,以半圆为形状每年侵蚀50m^2,问(0,0)开始到(x,y)结束需要多长时间poj1006:三个周期是常数.现在给三个周期出现高峰的时候,问下一次出现高峰是什么时候poj1007:求字符串排序poj1008:一种日历

程序设计与算法(一)

程序设计与算法 [北京大学] 第一周:枚举 完美立方 生理周期 称硬币 熄灯问题 讲义加群:597225218 输入:博客园程序设计与算法第一章 第二周:递归(一) 阶乘 汉诺塔 N皇后 波兰表达式 讲义加群:597225218 输入:博客园程序设计与算法第二章 第三周:递归(二) 表达式求值 上台阶 放苹果 算24 讲义加群:597225218 输入:博客园程序设计与算法第三章 第四周

Kotlin 介绍

Kotlin (0:00) 大家好,我是 Michael Pardo,今天我要给大家展示一下 Kotlin 这门语言,同时看看他如何让你在 Android 开发的时候更开心,更有效率. Kotlin 是一个基于 JVM 实现的静态语言.Kotlin 是 JetBrains 创造并在持续维护这门语言,对,就是那个创造了 Android Studio 和 IntelliJ 的公司. Kotlin 有几个核心的目标: 简约:帮你减少实现同一个功能的代码量. 易懂:让你的代码更容易阅读,同时易于理解.

Linux下的Mysql基本语句

Linux下的Mysql基本语句 实验目标 数据库常见概念 SQL语句概述-创建数据库 SQL语句之表的基本操作 实验环境 LAMB环境 服务端:xuegod63.cn     IP:192.168.1.63 客户端:xuegod64.cn                   IP:192.168.1.64   实验概述 数据库相关概念: DBD(数据库开发)  DBA(数据库管理员) SQL :结构化查询语言(Structured QueryLanguage)简称SQL 作用:结构化查询语言是

硬币称重问题

Q1:现在有硬币9个,有一个比其他8个轻,给一无砝码天平,最少几次可称出轻的硬币?? A1:可以采用二分法,但这里是有三分法更优. Q2:继Q1,如果硬币有10个呢?12个呢?100个呢?n个呢? A2:先三分,在缩小三分范围. Q3:9个硬币,有一个和其他8个重量不同,但不知道是比其他8个轻还是重,问几次可称出此硬币??硬币总数有10个呢?11个呢?n个呢? A3: Q4:硬币9个,第一堆3个标准重量,第二堆3个比标准重量轻,第三堆3个比标准重量重,几次可区分这三堆硬币?每堆有4个呢?5个呢?