POJ1013 称硬币

简介: 题目链接:http://poj.org/problem?id=1013题目大意有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。

题目链接:http://poj.org/problem?id=1013

题目大意

有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。

输入
第一行是测试数据组数。
每组数据有三行,每行表示一次称量的结果。银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币、天平右边放置的硬币、平衡状态。其中平衡状态用``up'', ``down'', 或 ``even''表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。

输出
输出哪一个标号的银币是假币,并说明它比真币轻还是重 。

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

解题思路

来源:北大郭炜老师

对于每一枚硬币先假设它是轻的,看这样是否符合称量结果。如果符合,问题即解决。如果不符合,就假设它是重的,看是否符合称量结果。

把所有硬币都试一遍,一定能找到特殊硬币。

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 char Left[3][7];   //天平左边硬币
 5 char Right[3][7];  //天平右边硬币
 6 char result[3][7]; //称量结果
 7 bool IsFake(char c,bool light);//light为真表示假设假币为轻,否则表示假设假币为重
 8 int main()
 9 {
10     int t;
11     cin >> t;
12     while(t--) 
13     {
14         for(int i = 0;i < 3; ++i)   cin >> Left[i] >> Right[i] >> result[i];
15         for(char c='A'; c<='L';c++)
16         {
17             if( IsFake(c,true) )//假设c这个硬币为假硬币而且它比真硬币轻
18             {
19                 cout << c << " is the counterfeit coin and it is light.\n";
20                 break;
21             }
22             else if( IsFake(c,false) )//假设c这个硬币为假硬币而且它比真硬币重
23             {
24                 cout << c << " is the counterfeit coin and it is heavy.\n";
25                 break;
26             }
27         }
28     }
29     return 0; 
30 }
31 bool IsFake(char c,bool light)//light 为真表示假设假币为轻,否则表示假设假币为重
32 {
33     for(int i = 0;i < 3; ++i) 
34     {
35         char * pLeft,*pRight; //指向天平两边的字符串
36         if(light)
37         {
38             pLeft = Left[i];
39             pRight = Right[i];
40         }
41         else
42         {
43             pLeft = Right[i];
44             pRight = Left[i];
45         }
46         
47         switch(result[i][0])
48         {
49             case 'u':
50                 if ( strchr(pRight,c) == NULL) return false;
51                 break;
52             case 'e':
53                 if( strchr(pLeft,c) || strchr(pRight,c)) return false;
54                 break;
55             case 'd':
56                 if ( strchr(pLeft,c) == NULL) return false;
57                 break;
58         }
59     }
60     return true;
61 }

 

相关文章
|
机器学习/深度学习 算法 数据挖掘
马尔科夫链(Markov Chain, MC)算法详解及Python实现
马尔科夫链(Markov Chain, MC)算法详解及Python实现
10565 115
马尔科夫链(Markov Chain, MC)算法详解及Python实现
|
机器学习/深度学习 监控 数据可视化
训练损失图(Training Loss Plot)
训练损失图(Training Loss Plot)是一种在机器学习和深度学习过程中用来监控模型训练进度的可视化工具。损失函数是衡量模型预测结果与实际结果之间差距的指标,训练损失图展示了模型在训练过程中,损失值随着训练迭代次数的变化情况。通过观察损失值的变化,我们可以评估模型的拟合效果,调整超参数,以及确定合适的训练停止条件。
2380 5
|
JavaScript 关系型数据库 MySQL
盘点6个.NetCore+Vue前后端分离的开源项目
盘点6个.NetCore+Vue前后端分离的开源项目
2590 0
|
网络协议 网络架构
TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式
本文章讲述了什么是IP分片、为什么要进行IP分片、以及IP分片的原理及分析。分片的偏移量的计算方法,一个IPv4包前三个分片的示例。还讲述了IPv4表示字段的作用,标志位在IP首部中的格式以及各个标志的意义:.........
4251 0
TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式
|
6月前
|
人工智能 自然语言处理 搜索推荐
AI对话像真人!交交:上海交大推出全球首个口语对话情感大模型,支持多语言与实时音色克隆
上海交通大学推出的交交是全球首个纯学术界自研的口语对话情感大模型,具备多语言交流、方言理解、角色扮演和情感互动等能力,通过创新技术实现端到端语音对话和实时音色克隆。
361 14
AI对话像真人!交交:上海交大推出全球首个口语对话情感大模型,支持多语言与实时音色克隆
|
9月前
|
SQL 安全 关系型数据库
MySQL UDF提权
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解MySQL UDF提权的机制、实现步骤及防范措施,提高系统的安全性和防护能力。
589 11
|
8月前
|
前端开发 测试技术 API
我同学不知道UnoCSS是什么,我教他用之后效率直接倍增
原子化 CSS 是一种 CSS 的架构方式,它倾向于小巧且用途单一的 class,并且会以视觉效果进行命名。可以将原子化的 CSS 框架理解为这类 CSS 的统称
758 5
计算机组成原理(6)-----指令执行过程
计算机组成原理(6)-----指令执行过程
901 0
|
机器学习/深度学习 人工智能 自然语言处理
人工智能在教育中的创新应用:个性化学习的未来
【9月更文挑战第18天】人工智能在教育中的创新应用正在深刻改变着我们的教学方式和学习体验。从个性化学习方案的制定到智能化辅导与反馈,从多元化学习资源的推荐到自动化评分与智能考试系统,AI技术正在为教育领域带来前所未有的变革。面对这一变革,我们需要以开放和批判的态度拥抱它,共同探索AI时代教育的无限可能,为每一个学习者创造更美好的未来。
743 12
|
存储 编解码 文件存储
Windows 中的硬链接、目录联接(软链接)、符号链接、快捷方式
【10月更文挑战第5天】本文介绍了四种链接类型的概念及用途:硬链接允许通过多个入口访问同一文件内容,适用于不复制文件的情况下提供多处访问;软链接(目录联接)用于创建目录间的虚拟映射,可跨越文件系统;符号链接则更为灵活,可链接文件或目录并指向任意路径;快捷方式则是Windows中常用的一种特殊文件类型,便于快速访问程序、文件或网络资源。分别描述了它们的定义、工作原理、特点以及创建方法。
2901 10