题目来源:http://poj.org/problem?id=1013

题目大意:有12枚硬币,其中有一枚假币。所有钱币的外表都一样,所有真币的重量都一样,假币的重量与真币不同,但我们不知道假币的重量是比真币轻还是重。现在有一个很准确的天平,我们可以用这个天平称3次来找到那枚假币。只要仔细选择三次称的方式,总可以再三次之内找出那枚假币。

输入:第一行一个正整数n表示样例个数。接下来每三行为一个测试样例。每行为一次称的结果。每枚硬币被编号为A--L。称量的结果有三种,分别用“up”、“down”和“even”表示。第一个字符串表示天平左边的硬币,第二个字符串表示右边的硬币。左边和右边的硬笔数总是相等的。第三个字符串的单词表明天平右边的状态。

输出:对于每个测试用例,输出假币的编号和这枚假币是比真币重还是轻。格式依照Sample output.


Sample Input

1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even

Sample Output

K is the counterfeit coin and it is light.

  注意到以下几点:

  1.某次称量天平平衡,说明天平两端都是真币.

  2.某次天气不平衡,说明这次称量没有用到的都是真币.

  3.如果假币比真币重,则假币只可能每次都出现在天平重的一端(轻则相反),所以若某硬币一次出现在重的一端另一次出现在轻了一端则为真币

  给每枚硬币一个编码,表示其状态。-1表示没有出现,1表示是真币,0表示可能是假币,且比真币轻,2表示可能是假币,且比真币重。

  依据上述观察,每称一次更新一次硬币状态。最终只有一枚硬币不为1。具体见代码。

 //////////////////////////////////////////////////////////////////////////
// POJ1013 Counterfeit Dollar
// Memory: 268K Time: 16MS
// Language: C++ Result: Accepted
////////////////////////////////////////////////////////////////////////// #include <iostream>
#include <string>
using namespace std; int main() {
int n;
cin >> n;
for (int i = ; i < n; i++) {
string l[], r[], b[];
int result[];
bool light = false;
for (int i = ; i < ; i++) {
result[i] = -;//未出现
}
cin >> l[] >> r[] >> b[] >> l[] >> r[] >> b[] >> l[] >> r[] >> b[]; for(int i = ; i < ; i++) {
if (b[i].compare("even") == ) {
for (int j = ; j < l[i].size(); j++) {
result[l[i][j] - 'A'] = ;
}
for (int j = ; j < r[i].size(); j++) {
result[r[i][j] - 'A'] = ;
}
} else if (b[i].compare("up") == ) {
bool mark[] = {false, false, false, false, false, false,
false, false, false, false, false, false};
for (int j = ; j < l[i].size(); j++) {
if (result[l[i][j] - 'A'] == -) {
result[l[i][j] - 'A'] = ;
} else if (result[l[i][j] - 'A'] == ) {
result[l[i][j] - 'A'] = ;
}
mark[l[i][j] - 'A'] = true;
}
for (int j = ; j < r[i].size(); j++) {
if (result[r[i][j] - 'A'] == -) {
result[r[i][j] - 'A'] = ;
} else if (result[r[i][j] - 'A'] == ) {
result[r[i][j] - 'A'] = ;
}
mark[r[i][j] - 'A'] = true;
}
for (int t = ; t < ; t++) {
if (mark[t] == false) {
result[t] = ;
}
}
} else {
bool mark[] = {false, false, false, false, false, false,
false, false, false, false, false, false};
for (int j = ; j < l[i].size(); j++) {
if (result[l[i][j] - 'A'] == -) {
result[l[i][j] - 'A'] = ;
} else if (result[l[i][j] - 'A'] == ) {
result[l[i][j] - 'A'] = ;
}
mark[l[i][j] - 'A'] = true;
}
for (int j = ; j < r[i].size(); j++) {
if (result[r[i][j] - 'A'] == -) {
result[r[i][j] - 'A'] = ;
} else if (result[r[i][j] - 'A'] == ) {
result[r[i][j] - 'A'] = ;
}
mark[r[i][j] - 'A'] = true;
}
for (int t = ; t < ; t++) {
if (mark[t] == false) {
result[t] = ;
}
}
}
}
for (int i = ; i < ; i++) {
if (result[i] == ) {
cout << char(i + 'A') << " is the counterfeit coin and it is light." << endl;
break;
} else if (result[i] == ) {
cout << char(i + 'A') << " is the counterfeit coin and it is heavy." << endl;
break;
}
}
}
system("pause");
}

附Discuss里面的一些测试数据:

 sample input 

 ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
AGHL BDEC even
JKI ADE up
J K even
ABCDEF GHIJKL up
ABC DEF even
I J down
ABCDEF GHIJKL up
ABHLEF GDIJKC down
CD HA even
A B up
B A down
A C even
A B up
B C even
DEFG HIJL even
ABC DEJ down
ACH IEF down
AHK IDJ down
ABCD EFGH even
AB IJ even
A L down
EFA BGH down
EFC GHD even
BA EF down
A B up
A C up
L K even
ACEGIK BDFHJL up
ACEGIL BDFHJK down
ACEGLK BDFHJI down
ACEGIK BDFHJL up
ACEGIL BDFHJK down
ACEGLK BDFHJI up sample output
K is the counterfeit coin and it is light.
I is the counterfeit coin and it is heavy.
I is the counterfeit coin and it is light.
L is the counterfeit coin and it is light.
B is the counterfeit coin and it is light.
A is the counterfeit coin and it is heavy.
A is the counterfeit coin and it is light.
L is the counterfeit coin and it is heavy.
A is the counterfeit coin and it is light.
A is the counterfeit coin and it is heavy.
L is the counterfeit coin and it is light.
K is the counterfeit coin and it is heavy.

Test data & answer

POJ1013 Counterfeit Dollar的更多相关文章

  1. poj1013.Counterfeit Dollar(枚举)

    Counterfeit Dollar Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 415  Solved: 237 Description Sally ...

  2. Counterfeit Dollar -----判断12枚钱币中的一个假币

     Counterfeit Dollar Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u ...

  3. POJ 1013 Counterfeit Dollar

    Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36206   Accepted: 11 ...

  4. Counterfeit Dollar 分类: POJ 2015-06-12 15:28 19人阅读 评论(0) 收藏

    Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41559   Accepted: 13 ...

  5. Poj 1013 Counterfeit Dollar / OpenJudge 1013(2692) 假币问题

    1.链接地址: http://poj.org/problem?id=1013 http://bailian.openjudge.cn/practice/2692 http://bailian.open ...

  6. POJ 1013:Counterfeit Dollar

    Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42028   Accepted: 13 ...

  7. 【poj1013】 Counterfeit Dollar

    http://poj.org/problem?id=1013 (题目链接) 题意 12个硬币中有1个是假的,给出3次称重结果,判断哪个硬币是假币,并且判断假币是比真币中还是比真币轻. Solution ...

  8. POJ 1013 Counterfeit Dollar 集合上的位运算

    Description Sally Jones has a dozen Voyageur silver dollars. However, only eleven of the coins are t ...

  9. D - Counterfeit Dollar(第二季水)

    Description Sally Jones has a dozen Voyageur silver dollars. However, only eleven of the coins are t ...

随机推荐

  1. 机器学习 Generative Learning Algorithm (A)

    引言 前面几讲,我们主要探讨了如何对 p(y|x;θ) (即y 相对于x的条件概率)进行建模的几种学习算法,比如,logistic regression 对 p(y|x;θ) 进行建模的假设函数为 h ...

  2. Mybatis学习--Mapper XML文件

    学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#insert_update_and_delete My ...

  3. H.264 码率设置

    一.什么是视频码率 视频码率是视频数据(包含视频色彩量.亮度量.像素量)每秒输出的位数.一般用的单位是kbps. 二.设置视频码率的必要性 在网络视频应用中,视频质量和网络带宽占用是相矛盾的.通常情况 ...

  4. 跨平台的WebRTC客户端框架:OpenWebRTC

    Webrtc的ios框架编译 http://www.th7.cn/Program/IOS/201502/390418.shtml WebRTC in WebKit : http://www.webrt ...

  5. 【LeetCode】018 4Sum

    题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...

  6. 浅谈Huffman树

    所谓Huffman树,就是叶子结点带权的\(K\)叉树,假设每个叶子的权值为\(v\),到根的距离为\(dep\),那么最小化\(\sum v_i*dep_i\)就是\(Huffman\)树的拿手好戏 ...

  7. BZOJ2733:[HNOI2012]永无乡

    浅谈线段树合并:https://www.cnblogs.com/AKMer/p/10251001.html 题目传送门:https://lydsy.com/JudgeOnline/problem.ph ...

  8. DCloud-MUI:Hello mui

    ylbtech-DCloud-MUI:Hello mui MUI-最接近原生App体验的前端框架 1. 返回顶部 1. MUI-最接近原生App体验的前端框架 极小 100k的js文件,60k的css ...

  9. hadoop mapreduce 计算平均气温的代码,绝对原创

    1901 46 1902 21 1903 48 1904 33 1905 43 1906 47 1907 31 1908 28 1909 26 1910 35 1911 30 1912 16 1913 ...

  10. C++知识点总结(二)

    1.字符串的部分拷贝 ① 利用标准库函数strncpy(),可以将一字符串的一部分拷贝到另一个字符串中.strncpy()函数有3个参数:第一个参数是目录字符串:第二个参 数是源字符串:第三个参数是一 ...