POJ 1013 (简单模拟)

原创 2016年05月30日 18:51:07

题意:有一个天平,和12枚硬币(有一枚是假的),用A~L表示,但是不一定每个字母都会出现。现在有三次称量结果,求一枚假硬币,每个样例都有解。

这个问题可以利用标记的次数来判断,标记的次数越多则可以认为是假的。

abs()函数求绝对值,头文件是#include<stdlib.h>

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<string.h>
int main()
{
    int n;
    scanf("%d",&n);
    int flag[12];                              //对每次天平状态进行记录
    char p1[15],p2[15],updown[10];
    while(n--)
    {
        int f;                  //注意作用域
        memset(flag,0,sizeof(flag));
        for(int t = 0;t < 3; t++)
        {
            scanf("%s%s%s",p1,p2,updown);
            int lenth = strlen(p1);         //题意中p1 p2的长度相同
            if(strcmp(updown,"even") == 0)
            {
                for(int i = 0;i < lenth; i++) //标记为真
                {
                    flag[p1[i] - 'A'] = 12;
                    flag[p2[i] - 'A'] = 12;
                }
            }
            if(strcmp(updown,"up") == 0)
            {
                for(int i = 0;i < lenth; i++)
                {
                    if(flag[p1[i] - 'A'] != 12) //如果是真,则不改变
                        flag[p1[i] - 'A']++;
                    if(flag[p2[i] - 'A'] != 12)
                        flag[p2[i] - 'A']--;
                }
            }
            if(strcmp(updown,"down") == 0)
            {
                for(int i = 0;i < lenth; i++)
                {
                    if(flag[p1[i] - 'A'] != 12)
                        flag[p1[i] - 'A']--;
                    if(flag[p2[i] - 'A'] != 12)
                        flag[p2[i] - 'A']++;
                }
            }
            int maxn = 0;
            f = 0;              //用作标记假的位置
            for(int i = 0;i < 12; i++)
            {
                if(flag[i] == 12)
                    continue;
                if(maxn < abs(flag[i]))
                    {
                        maxn = abs(flag[i]);
                        f = i;
                    }
            }
        }
        if(flag[f] > 0)         //重的一方在加,所以大于零
            printf("%c is the counterfeit coin and it is heavy.\n",f+'A');
        if(flag[f] < 0)
            printf("%c is the counterfeit coin and it is light.\n",f+'A');
    }
    return 0;
}


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

相关文章推荐

POJ 1013 Counterfeit Dollar 找假硬币 模拟

题意:多组测试数据,每组三行。 有一打(12枚)硬币,其中有且仅有1枚假币,11枚真币 用A~L作为各个硬币的代号 假币可能比真币略轻,也可能略重 现在利用天枰,根据Input输入的3次称量,...

poj1013 模拟

如题:http://poj.org/problem?id=1013 Counterfeit Dollar Time Limit: 1000MS   Memory Limit: ...

POJ 1029 硬币称量类型二 与POJ 1013类比 模拟题

这道题,我自己的代码跟人家的比起来明显啰嗦的多,又懒得再写一遍了,特转载过来提醒自己。 POJ 1029 硬币称量类型二 与POJ 1013类比 模拟题 分类: ACM-模拟题 ...
  • baisung
  • baisung
  • 2012年06月03日 19:08
  • 292

POJ1013-Counterfeit Dollar

  • 2011年08月04日 22:58
  • 8KB
  • 下载

二分图简单模拟题 POJ 1274、1325、1469、2446

POJ 1274 POJ 1325 POJ 1469 POJ 2446

POJ 3032 简单队列模拟

http://poj.org/problem?id=3032提交的时候正赶上系统故障,全市Runtime Error!!!一看Online Status,原来全是RT,POJ出故障了!!!! Card...

POJ1318 Word Amalgamation 简单模拟

题意: 其实就是找匹配,先给定n个字符串形成一个字典库,然后再给你任意一个字符串,问你这个字符串经过字符随意组合能形成多少个字典库里面匹配的字符串。 思路: 因为字符串最长长度为6,库的大小最大...
  • wuyanyi
  • wuyanyi
  • 2012年01月29日 14:36
  • 985

Distance on Chessboard POJ - 1657 简单模拟

Distance on Chessboard  POJ - 1657  solution: 终点和起点在同一点时所有值都为0; 王:0或是起点和终点的横纵坐标差的最大值; 后:0...
  • mjj1024
  • mjj1024
  • 2017年08月04日 21:52
  • 43

POJ 2996 简单模拟

Help Me with the Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4363   Acce...

POJ 1922 Ride to School 简单模拟

Ride to School Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20162   Accepted: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1013 (简单模拟)
举报原因:
原因补充:

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