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

  • 题目

    有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]; //天平左边硬币,3代表3次称量情况,7代表硬币数
 5 char Right[3][7]; //天平右边硬币
 6 char result[3][7]; //结果
 7 bool IsFake(char c,bool light) ;
 8 //light 为真表示假设假币为轻,否则表示假设假币为重
 9 int main() {
10     int t; //测试数据组数
11     cin >> t;
12     while(t--) {
13          for(int i = 0;i < 3; ++i) cin >> Left[i] >> Right[i]>>result[i];
14          for(char c=‘A‘; c<=‘L‘;c++) {
15              if( IsFake(c,true) ){
16                  cout << c << " is the counterfeit coin and it is light.\n";
17                  break;
18              }
19              else if( IsFake(c,false) ){
20                  cout << c << " is the counterfeit coin and it is heavy.\n";
21                  break;
22              }
23          }
24     }
25     return 0;
26 }
27 bool IsFake(char c,bool light)
28 //light 为真表示假设假币为轻,否则表示假设假币为重
29 {
30     for(int i = 0;i < 3; ++i) {
31         char * pLeft,*pRight; //指向天平两边的字符串
32         if(light) {
33             pLeft = Left[i];
34             pRight = Right[i];
35         }
36         else {
37             pLeft = Right[i];
38             pRight = Left[i];
39     }
40     switch(result[i][0]) {
41         case ‘u‘:
42             if ( strchr(pRight,c) == NULL)
43                 return false;
44         break;
45         case ‘e‘:
46             if( strchr(pLeft,c) || strchr(pRight,c))
47                 return false;
48         break;
49         case ‘d‘:
50             if ( strchr(pLeft,c) == NULL)
51                 return false;
52         break;
53     }
54 }
55     return true;
56 }                                
时间: 2024-10-13 10:29:57

【算法系列之枚举】称硬币的相关文章

(枚举)称硬币

题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

【算法系列之枚举】生理周期

题目 人有体力.情商.智商的高峰日子,它们分别每隔 23天.28天和33天出现一次.对于每个人,我们想 知道何时三个高峰落在同一天.给定三个高峰出现 的日子p,e和i(不一定是第一次高峰出现的日子), 再给定另一个指定的日子d,你的任务是输出日子d 之后,下一次三个高峰落在同一天的日子(用距离d 的天数表示).例如:给定日子为10,下次出现三 个高峰同一天的日子是12,则输出2. 输入 输入四个整数:p, e, i和d. p, e, i分别表示体力.情感和 智力高峰出现的日子.d是给定的日子,可

基础算法之二——枚举法

基础算法之二--枚举法"赛利的硬币" 题目描述 赛利有 12枚银币.其中有 11枚真币和1枚假币.假币看起来和真币没有区别,但是重量不同.但赛利不知道假币比真币轻还是重.于是他向朋友借了一架天平.朋友希望赛利称三次就能找出假币并且确定假币是轻是重.例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的.如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币.经过精心安排每次的称量,赛利保证在称三次后确定假币. 输入数据 输入有三行,每行表示一次称量的结果.赛利事先

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

[算法系列之二十六]字符串匹配之KMP算法

一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 二 基于部分匹配表的KMP算法 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含搜索串"ABCDABD"? 步骤1:字符串"BBC ABC

(转载)排序算法系列

排序算法系列 目录 概述 概念 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列. 排序分为内部排序和外部排序. 若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序. 反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序. 排序分类 如果按照策略来分类,大致可分为:交换排序.插入排序.选择排序.归并排序和基数排序.如 图-排序策略分类图 所示. 图-排序策略分类图 算

算法基础_枚举

枚举:基于逐个尝试答案的一种文体求解策略 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

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示 算法系列之二十三离散傅立叶变换之音频播放与频谱显示 导语 什么是频谱 1 频谱的原理 2 频谱的选择 3 频谱的计算 显示动态频谱 1 实现方法 2 杂项说明 结果展示 导语 频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷.在上一篇对离散傅立叶变换介绍的基础上,本篇就进一步介绍一下频谱是怎么回事儿,下一篇继续介绍

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<