Counterfeit Dollar

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 50515   Accepted: 15808

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

 
分析:
很有意思的题目,人脑很好处理,但是用计算机来做就有点不知如何下手了。
拿到题目,列出方程,各种约,就能得到答案,但是这种方法,用计算机不好实现。后来突然想到,可以用“嫌疑人”的方法来做。
解题:
已知条件:1、只有一枚假币;2、假币可重可轻;3、一定可以根据已知的3次测量来判断出假币。
给每个硬币设置2个属性:1)是否为真;2)可疑度。
解题步骤:
先遍历所有even的case,设置even场景下的硬币都为真。
再遍历剩余的case,
当为up的时候,除去已知为真的硬币,对左硬币可疑度+1,对右硬币可疑度-1。
当为down的时候,除去已知为真的硬币,对右硬币可疑度+1,对左硬币可疑度-1。
结束后,
查找硬币中,可疑度绝对值最大的硬币,就是假币了。当可疑度为正,那么假币重;当可疑度为负,那么假币轻。
 
PPS:话说poj为啥会挂了呢。。。
 
 #include <stdio.h>
#include <string.h>
#include <stdlib.h> #define TRUE (int)1
#define FALSE (int)0 #define CASE_NUM 3
#define MAX_COIN_NUM 12 typedef int BOOL; typedef struct
{
int strLen;
char str1[MAX_COIN_NUM+];
char str2[MAX_COIN_NUM+];
char delta[];
}WeightCase; WeightCase g_case[CASE_NUM];
BOOL g_isEvenCoin[MAX_COIN_NUM];
char g_coin[MAX_COIN_NUM]; const char up[] = "up\0";
const char down[] = "down\0";
const char even[] = "even\0"; void Input()
{
int i = ;
for(i = ; i < CASE_NUM; i++)
{
scanf(" %s", g_case[i].str1);
scanf(" %s", g_case[i].str2);
scanf(" %s", g_case[i].delta);
g_case[i].strLen = strlen(g_case[i].str1);
}
} void ProcEvenCase()
{
int i, j; for(i = ; i < CASE_NUM; i++)
{
if( != strcmp(g_case[i].delta, even)) continue; for(j = ; j < g_case[i].strLen; j++)
{
g_isEvenCoin[g_case[i].str1[j] - 'A'] = TRUE;
g_isEvenCoin[g_case[i].str2[j] - 'A'] = TRUE;
}
}
} void ProcOtherCase()
{
int i, j, delta; for(i = ; i < CASE_NUM; i++)
{
if( == strcmp(g_case[i].delta, even)) continue; if( == strcmp(g_case[i].delta, up))
delta = ;
else
delta = -; for(j = ; j < g_case[i].strLen; j++)
{
if(!g_isEvenCoin[g_case[i].str1[j] - 'A']) g_coin[g_case[i].str1[j] - 'A'] += delta;
if(!g_isEvenCoin[g_case[i].str2[j] - 'A']) g_coin[g_case[i].str2[j] - 'A'] -= delta;
}
}
} void Proc()
{
memset(g_coin, , sizeof(g_coin));
memset(g_isEvenCoin, FALSE, sizeof(g_isEvenCoin)); ProcEvenCase();
ProcOtherCase();
} void Output()
{
int i, tmp, pos = , max = ;
char coin;
for(i = ; i < sizeof(g_coin); i++)
{
tmp = abs(g_coin[i]);
if(tmp > max)
{
max = tmp;
pos = i;
}
}
coin = pos+'A'; if(g_coin[pos] < )
printf("%c is the counterfeit coin and it is light.\n", coin);
else
printf("%c is the counterfeit coin and it is heavy.\n", coin);
} int main()
{
int num = ;
scanf("%d", &num);
while(num--)
{
Input();
Proc();
Output();
} return ;
}

北大poj- 1013的更多相关文章

  1. 北大POJ题库使用指南

    原文地址:北大POJ题库使用指南 北大ACM题分类主流算法: 1.搜索 //回溯 2.DP(动态规划)//记忆化搜索 3.贪心 4.图论 //最短路径.最小生成树.网络流 5.数论 //组合数学(排列 ...

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

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

  3. 模拟,找次品硬币,Counterfeit Dollar(POJ 1013)

    题目链接:http://poj.org/problem?id=1013 解题报告: 1.由于次品的重量不清楚,用time['L'+1]来记录各个字母被怀疑的次数.为负数则轻,为正数则重. 2.用zer ...

  4. POJ 1013 Counterfeit Dollar

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

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

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

  6. POJ 1013 小水题 暴力模拟

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

  7. poj 1013(uva 608) Counterfeit Dollar

    #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #in ...

  8. POJ 1013

    #include"string.h"char left[3][7],right[3][7],result[3][5];bool isHeavy(char x ){    int i ...

  9. POJ 1013:Counterfeit Dollar

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

  10. 思维+模拟--POJ 1013 Counterfeit Dollar

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

随机推荐

  1. google搜索引擎爬虫爬网站原理

    google搜索引擎爬虫爬网站原理 一.总结 一句话总结:从几个大站开始,然后开始爬,根据页面中的link,不断爬 从几个大站开始,然后开始爬,根据页面中的link,不断加深爬 1.搜索引擎和数据库检 ...

  2. php输出语句有什么不同

    print()函数: 输出一个或者多个字符串.同echo一样,实际上它并不是一个函数.print有返回值.而echo没有.当其执行失败时返回false,成功 则返回true,速度比echo稍慢.只能打 ...

  3. prometheus告警插件-alertmanager

    prometheus本身不支持告警功能,主要通过插件alertmanage来实现告警.AlertManager用于接收Prometheus发送的告警并对于告警进行一系列的处理后发送给指定的用户. pr ...

  4. 《SSO CAS单点系列》之 APP原生应用如何访问CAS认证中心

    4.开发支持APP登录的移动服务端接口.接收APP登录请求,采用HttpClient转发至CAS认证中心登录,返回json数据解析并最终返回给客户端.本地会话采用redis维护,登录成功,返回acce ...

  5. Android 工程越来越大,运行变卡解决方法

    打开AS的安装目录 android-studio/bin/studio.exe.vmoptions studio64.exe.vmoptions -Xms2048m-Xmx2048m-XX:Reser ...

  6. C# 结构与类的区别

    一.定义方式 定义结构: struct PointStruct //默认的访问权限是 public { public int X { get; set; } public int Y { get; s ...

  7. Vim 常用简单命令

    Vim中有三个模式,1.刚进入Vim画面的是命令模式,2. 在命令模式输入:进入末行模式, 3. 在命令模式输入 a或者i或者o进入编辑模式 在末行或者编辑模式中可以通过ESC回到命令模式 举例当前目 ...

  8. webpack中 resolve.alias 配置,@import相关踩坑

    1.在使用webpack打包项目时,可以在配置文件中配置resolve.alias来定义一些绝对路径,方便在项目中灵活使用路径,举例如下: resolve: { extensions: [‘.js‘, ...

  9. 如何练习打字之用英文写文章 & 如何调养右手之用左手握鼠标

    part1:how to practise your typing via writing a English blog it's easy to write english for chinese. ...

  10. Tensorflow(添加噪声的方式)

    在去噪自编码器中,模型的输入是原始的输入经过某种形式的加噪过程后的衰弱的形式,所以加噪声一般分为:加高斯白噪声,掩模噪声,椒盐噪声. 1.加性高斯噪声 self.scale = tf,placehol ...