poj1013 Counterfeit Dollar

原创 2016年06月02日 09:25:32

http://poj.org/problem?id=1013

12个硬币里有1个假币,枚举每一个硬币,如果它是轻或是重,则为假币。

那么如何判断它是轻或是重呢?

判断是轻:

    假设它就是轻。然后由天平三次称量结果倒推:如果称量结果为up,则它一定在右边。如果称量结果为even,则它既不在左边,也不在右边。如果称量结果为down,则它一定在左边。上述都满足,则毫无疑问它就是轻。否则有一个不成立,它就不为轻。

同理,可得判断是否为重。

#include <stdio.h>
#include <string.h>
char left[3][7],right[3][7],result[3][5];
int inLeft(int i,char x)
{
    int j;
    for(j=0;j<strlen(left[i]);j++)
        if(left[i][j]==x)
            return 1;
    return 0;
}
int inRight(int i,char x)
{
    int j;
    for(j=0;j<strlen(right[i]);j++)
        if(right[i][j]==x)
            return 1;
    return 0;
}
int isLight(char x)//判断硬币x是否为轻
{
    int i;
    for(i=0;i<3;i++)
    {
        switch(result[i][0])
        {
            case 'u':if(!inRight(i,x)) return 0; 
                      break;
            case 'e':if(inLeft(i,x)||inRight(i,x)) return 0;
                      break;
            case 'd':if(!inLeft(i,x)) return 0;
                      break;
        }
    }
    return 1;
}
int isHeavy(char x)//判断硬币x是否为重
{
    int i;
    for(i=0;i<3;i++)
    {
        switch(result[i][0])
        {
            case 'u':if(!inLeft(i,x)) return 0; 
                      break;
            case 'e':if(inLeft(i,x)||inRight(i,x)) return 0;
                      break;
            case 'd':if(!inRight(i,x)) return 0;
                      break;
        }
    }
    return 1;
}
int main()
{
    char ch;
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s %s %s",left[0],right[0],result[0]);
        scanf("%s %s %s",left[1],right[1],result[1]);
        scanf("%s %s %s",left[2],right[2],result[2]);
        for(ch='A';ch<='L';ch++)//枚举12个硬币
        {
            if(isLight(ch))
            {
                printf("%c is the counterfeit coin and it is light.\n",ch);
                break;
            }
            else if(isHeavy(ch))
            {
                printf("%c is the counterfeit coin and it is heavy.\n",ch);
                break;
            }
        }
    }
    return 0;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

北大暑假训练计划—POJ1013 Counterfeit Dollar(C语言)

Counterfeit Dollar Description Sally Jones has a dozen Voyageur silver dollars. However, only elev...
  • hui1570
  • hui1570
  • 2014年07月26日 16:14
  • 202

九度OJ 1150:Counterfeit Dollar(假美元) (分析、检验)

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:485 解决:215 题目描述:     Sally Jones has a dozen Voya...
  • thudaliangrx
  • thudaliangrx
  • 2015年10月24日 13:00
  • 375

枚举—案例(称硬币poj1013)

描述 赛利有12枚银币。其中有11枚真币和1枚假币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。于是他向朋友借 了一架天平。朋友希望赛利称三次就能找出假币并且确定假币是轻是...
  • Randyhe_
  • Randyhe_
  • 2017年11月02日 20:14
  • 60

android之gradle构建工具学习之路(二)

Syntax This chapter covers the syntax of the Groovy programming language. The grammar of the langua...
  • u013022222
  • u013022222
  • 2015年09月15日 21:04
  • 926

Dollar toolbox 学习笔记(一)

 Dollar toolbox 学习笔记(一)            Dollar toolbox工具包是dollar写的关于行人检测的MATLAB工具包,工具包是对他经典论文的实...
  • Ddreaming
  • Ddreaming
  • 2016年08月08日 17:06
  • 2772

正则表达式中模式修正符作用详解(i、g、m、s、x、e)

正则表达式中常用的模式修正符有i、g、m、s、x、e等。它们之间可以组合搭配使用。 它们的作用如下:  //修正符:i 不区分大小写的匹配;          //如:"/abc/i"可以与abc...
  • onthewaygun
  • onthewaygun
  • 2013年08月16日 19:42
  • 1789

poj1013解题报告

首先,感谢優YoU,我是看了她的博客后才学会解题的,对此不胜感激。       解题先看题,首先我们知道有一打银币,编号为A-L,也就是说,我们有12枚银币(试想一下你有了12枚袁大头,是不是很高兴)...
  • DongChengRong
  • DongChengRong
  • 2017年04月20日 20:11
  • 204

POJ1013秤硬币

POJ1013 Description   Sally Jones has a dozen Voyageur silver dollars. However, only eleven of ...
  • ReCclay
  • ReCclay
  • 2017年03月02日 23:49
  • 141

POJ1013 称硬币

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

POJ1013算法解析

POJ1008 Counterfeit Dollar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 47335 ...
  • geek_jerome
  • geek_jerome
  • 2017年08月06日 10:21
  • 78
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj1013 Counterfeit Dollar
举报原因:
原因补充:

(最多只允许输入30个字)