【题目链接】

OpenJudge NOI 2.1 15:Counterfeit Dollar

【题目考点】

1. 枚举

【题目翻译】

题目

假币

描述

莎莉琼斯有12枚航记银元,但是,只有其中的11个是真正的银元,有1枚是伪造的假币,尽管它的颜色和形状大小让它无法与真正的银元区分开来。这个假币与其他硬币的重量不同,但莎莉不知道它与其他硬币相比是更重还是更轻。

幸运的是,莎莉有一个朋友借给了她一个十分精确的天平,这个朋友给了莎莉三次称重的机会来找出那个假币。例如,如果莎莉称两枚硬币且天平平衡,那么她就知道这两枚硬币是真的。现在,如果莎莉将其中一枚真硬币与第三个硬币称重,天平不平衡,那么她就知道第三枚硬币是假币,并且她还能通过天平哪边向上、向下移动来判断那个假币是轻还是重。
通过仔细选择如何称重,莎莉可以保证,她只需要3次称重就可以找到那枚假币。

输入

第一行输入是一个整数n (n>0) 指明有几组测试数据,每组数据由三行输入组成,一行代表一次称重。莎莉用字母A到L标记了所有硬币。每次称重的信息都包括两个字母字符串,与“up”、“down”、“even”三个单词中的一个词。第一个字母字符串表示天平左盘的硬币,第二个字母字符串则是天平右盘的硬币(莎莉总是在天平的左右两盘分别放入相同数量的银元)。第三个位置的单词是表明天平的右边是会向上移动、向下移动,还是保持平衡。

输出

对于每组数据,输出字母来表明哪一个是假币,并判断它是更重还是更轻。解决方案始终唯一确定。
这句话第一个字母为假币对应的字母,最后一个单词为:light(更轻)或heavy(更重)。

来源

East Central North America 1998

【解题思路】

一共有A–L共十二枚硬币,其中一枚假币,假币可能更轻或更重。
所以可能的情况有:
0更轻,0更重,1更轻,1更重,…,11更轻,11更重。一共24种情况。
枚举这24种情况,看哪种情况下,输入指定的三次天平比较结果与实际的结果相同。

假设输入为:ABCI EFJK up
如果我假设A是更轻的假币,那么右端应该下沉,实际的结果是右端上翘,与实际结果不同。
如果我假设A是更重的假币,那么右端应该上翘,与实际结果相同。

如果在当前假币情况下,输入指定的三次天平比较的结果与实际结果都相同,那么此时假币的情况就是真实的,可行的。否则该假币情况不可行。

【题解代码】

解法1:

  • C风格
#include<bits/stdc++.h>
using namespace std;
#define N 15
bool hasCh(char s[], char c)//字符串s中是否包含字符c
{int len = strlen(s);for(int i = 0; i < len; ++i)if(s[i] == c)return true;return false;
}
void check(bool ishev, bool hl, bool hr, char res[])//ishev表示假币是否更重,hl表示左侧是否有假币 ,hr表示右侧是否有假币,res保存结果字符串
{if(!hl && !hr)strcpy(res, "even");else if(!ishev && !hl && hr || ishev && hl && !hr)//更轻的在右边,或更重的在左边 strcpy(res, "up");else if(!ishev && hl && !hr || ishev && !hl && hr)//更轻的在左边,或更重的在右边 strcpy(res, "down");
}
int main()
{char s[4][4][N], lh[2][N] = {"light", "heavy"}, res[N];//输入的字符串 int n;scanf("%d", &n);bool isMatch, isHeavy;while(n--){for(int i = 1; i <= 3; ++i)scanf("%s %s %s", s[i][1], s[i][2], s[i][3]);for(char c = 'A'; c <= 'L'; ++c)//假设假币为c {for(int k = 0; k < 2; ++k)//假设假币为lh[k],可能的值为light更轻,或heavy更重 {isMatch = true, isHeavy = strcmp(lh[k], "heavy") == 0; for(int j = 1; j <= 3; ++j)//看比较规则j {bool hl = hasCh(s[j][1], c), hr = hasCh(s[j][2], c);check(isHeavy, hl, hr, res);if(strcmp(res, s[j][3]) != 0)//如果当前假币情况得到的结果与预设结果不同 {isMatch = false;break;}}if(isMatch){printf("%c is the counterfeit coin and it is %s.\n", c, lh[k]);break;}}if(isMatch)break;}}return 0;
}
  • C++风格
#include<bits/stdc++.h>
using namespace std;
bool hasCh(string s, char c)//判断s中是否有c
{for(int i = 0; i < s.length(); ++i)if(s[i] == c)return true;return false;
}
string getRes(char f, string lh, string s1, string s2)//f是假币,lh:字符串 表示更重或更轻,天平两边是s1,s2,看能得到什么结果
{bool h1 = hasCh(s1, f), h2 = hasCh(s2, f);//h1:s1中是否有f,h2:s2中是否有fif(h1 == false && h2 == false)return "even";else if(h1 == true && h2 == false){if(lh == "heavy")return "up";elsereturn "down";}else if(h1 == false && h2 == true){if(lh == "heavy")return "down";elsereturn "up";}
}
int main()
{bool isMatch;int n;cin >> n;string s[4][4];string lh[2] = {"light", "heavy"};while(n--){for(int i = 1; i <= 3; ++i)for(int j = 1; j <= 3; ++j) cin >> s[i][j];for(char c = 'A'; c <= 'L'; ++c)//假设假币为c {for(int k = 0; k < 2; ++k)//假设假币为lh[k],可能的值为light更轻,或heavy更重 {isMatch = true;//当前假币情况是否可以让3次天平的结果都是预设结果。 for(int i = 1; i <= 3; ++i){if(getRes(c, lh[k], s[i][1], s[i][2]) != s[i][3])//如果当前假币情况得到的结果与预设结果不同 { isMatch = false;            break;}}if(isMatch){cout << c << " is the counterfeit coin and it is " << lh[k] << '.' << endl;break;}}if(isMatch)//如果找到合适的假币,则跳出 break;}}return 0;
}

OpenJudge NOI 2.1 15:Counterfeit Dollar相关推荐

  1. 信息学奥赛一本通 1233:接水问题 | 1950:【10NOIP普及组】接水问题 | OpenJudge NOI 1.9 15 | 洛谷 P1190 [NOIP2010 普及组] 接水问题

    [题目链接] ybt 1233:接水问题 ybt 1950:[10NOIP普及组]接水问题 OpenJudge NOI 1.9 15:接水问题 洛谷 P1190 [NOIP2010 普及组] 接水问题 ...

  2. OpenJudge NOI 1.8 15:细菌的繁殖与扩散

    [题目链接] OpenJudge NOI 1.8 15:细菌的繁殖与扩散 [题目考点] 1. 二维数组 2. 方向数组 在一个矩阵中,当前位置为(sx, sy),将下一个位置与当前位置横纵坐标的差值记 ...

  3. 信息学奥赛一本通 1173:阶乘和 | OpenJudge NOI 1.6 15 | 洛谷 P1009 [NOIP1998 普及组] 阶乘之和

    [题目链接] ybt 1173:阶乘和 注:一本通上这题,应该把n≤50n\le50n≤50当做n≤100n\le100n≤100来看 OpenJudge NOI 1.6 15:阶乘和 洛谷 P100 ...

  4. 信息学奥赛一本通 1139:整理药名 | OpenJudge NOI 1.7 15

    [题目链接] ybt 1139:整理药名 OpenJudge NOI 1.7 15:整理药名 [题目考点] 1. 字符串处理 2. ASCII码 大小写判断 判断一个字符c是不是大写字母:c > ...

  5. OpenJudge NOI 1.5 15:银行利息

    [题目链接] OpenJudge NOI 1.5 15:银行利息 [题目考点] 1. 循环求幂 设变量r初始值为1:int r = 1; 循环n次每次循环中输入变量a,将r的值设为r*a:r *= a ...

  6. 信息学奥赛一本通 1053:最大数输出 | OpenJudge NOI 1.4 15

    [题目链接] ybt 1053:最大数输出 OpenJudge NOI 1.4 15:最大数输出 [题目考点] 1. if-else嵌套 2. 逻辑表达式 3. <algorithm> 中 ...

  7. 信息学奥赛一本通 1038:苹果和虫子 | OpenJudge NOI 1.3 15 | OpenJudge NOI 1.4 21

    [题目链接] ybt 1038:苹果和虫子 OpenJudge NOI 1.3 15:苹果和虫子 OpenJudge NOI 1.4 21:苹果和虫子2 [题目考点] 1. if-else语句 if( ...

  8. Counterfeit Dollar(找硬币)

    第一次做英文题,着实给我整的有点懵逼(毕竟四级是水过去的,这个学期也没打算考六级) 原题如下:OpenJudge - 15:Counterfeit Dollar 大致意思是通过三次比较结果,找12枚硬 ...

  9. 英语题目翻译——OJ_15: Counterfeit Dollar

    题目:15:Counterfeit Dollar(OpenJudge - 15:Counterfeit Dollar) 翻译: Sally Jones有一打旅行者银币.然而,只有十一个硬币真银币,尽管 ...

最新文章

  1. 事务、视图、索引、备份、还原
  2. MATLAB实战系列(三十一)-基于MATLAB的异步电机调速系统仿真
  3. 金融领域下的数据挖掘算法应用:XGboost模型
  4. Go 语言 cannot find module providing package github.com/
  5. iphone导出通讯录到安卓_科技资讯:iPhone苹果手机换新机如何将旧手机的通讯录导出到新的...
  6. spring boot 使用视图modelandview
  7. 第4章 Python 数字图像处理(DIP) - 频率域滤波3 - 取样和取样函数的傅里叶变换、混叠
  8. hexo本地博客的转移
  9. 老师也不是什么好东西
  10. python和c 的区别-c 跟 python的区别有哪些
  11. 显卡刷bios改型号_A卡修改BIOS软件/刷显卡BIOS软件
  12. 优车车欲用Uber模式和传统驾校一起打一场漂亮仗
  13. 智伴机器人wifi键在哪里_智伴机器人介绍和按键功能
  14. 一款很漂亮的一天只弹窗一次的公告
  15. Chrome V8让你更懂JavaScript
  16. C++ stack 遍历
  17. 大数据可视化工程师岗位要求包括哪些?
  18. linux 心跳灯_Linux下信号灯的使用
  19. 读书笔记:云计算概念、技术和架构
  20. 阿里云服务器安装图形化界面(CentOS)

热门文章

  1. 三元函数php,PHP三元运算符
  2. 新手小白该怎么学习Java
  3. python批量创建对象
  4. 雷神911K笔记本安装Win7系统
  5. Spark进阶之shuffle深入解析
  6. 拼多多放心推系统必须知道的规则!千万别错过
  7. 阳新一中2021高考成绩查询入口,点燃激情 赢在高考 阳新一中举办2021届高三年级高考励志演讲报告会...
  8. 关于在ubuntu上调试ODOO8.0的几个问题
  9. LVS + Keepalived 实现高可用负载均衡
  10. python中字典的函数_python字典函数使用