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;
}


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

poj1013解题报告

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

POJ2080简单模拟

Calendar Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13574   Acce...
  • qq_36258516
  • qq_36258516
  • 2017年05月01日 21:46
  • 235

POJ1013 称硬币

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

poj 几道简单的搜索题 (一)

题目:poj 2488 A Knight's Journey 题意: 给一个m*n的棋盘,马走日,给出一条字典序最小的马的路线来走完整个棋盘? 分析: 如果能走完棋盘,那么从(1,1)点d...
  • hjt_fathomless
  • hjt_fathomless
  • 2016年07月13日 16:24
  • 574

poj1132 简单模拟

Border Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3842   Accepte...
  • Summer__show_
  • Summer__show_
  • 2016年05月24日 20:17
  • 355

POJ 1013 小水题 暴力模拟

Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3577...
  • hnust_xiehonghao
  • hnust_xiehonghao
  • 2013年07月12日 17:49
  • 2706

poj初期基本算法

想想接触ACM已经一年了,参加ACM也半年了。大四只有少量的课程,一般都准备考研、找工作、实习了。想想我的大学生活俨然已经走过了一半,一年半以来,不说自己大学过得如何,至少做的还不算太差,时间过的真是...
  • consciousman
  • consciousman
  • 2017年01月13日 17:30
  • 855

poj1084(求逆序数)

题意:给一个长度为n的序列,每次交换相邻的元素,求最少的交换次数。也就是求冒泡排序的交换次数。 解题思路:对于冒泡排序,每一次相邻交换,那么这个序列的逆序数减1,当这个序列有序是,逆序数就为0。我们...
  • u013509299
  • u013509299
  • 2014年09月04日 21:24
  • 617

POJ 1013 解题报告

思路是:如果是even,那么左右出现的都不是要找的那个,排除出去。对所有的重的一边取个交集,对所有轻的一边也取个交集。交集排除掉even的应该是空的或者只有一个。这个就是要找的。原因是 如果一个coi...
  • thestoryofsnow
  • thestoryofsnow
  • 2014年11月30日 08:58
  • 315

poj 1013 称硬币

Counterfeit Dollar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 46303 Accepted: 1464...
  • xunfengdumo
  • xunfengdumo
  • 2017年03月20日 11:21
  • 152
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1013 (简单模拟)
举报原因:
原因补充:

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