zoukankan      html  css  js  c++  java
  • poj1029 False coin

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

    题目大意:“金条”银行从可靠的消息来源得知,在他们最后一组N个硬币中,一枚硬币是假的,与其他硬币的重量不同(其他硬币的重量相等)。在经济危机之后,他们只有一个简单的平衡。使用这种平衡,我们可以确定左边的物体的重量是否小于,大于或等于右边的物体的重量。为了检测假币,银行职员将所有的硬币从1到N进行编号,从而将每个硬币分配给一个唯一的整数标识符。之后,他们开始在左边的平底锅和右边的平底锅里放置等量的硬币,以使各种硬币的数量增加。仔细记录了硬币的标识符和权重的结果。您将编写一个程序,该程序将帮助银行职员使用这些权重的结果来确定假硬币的标识符。输入文件的第一行包含两个整数N和K,由空格分隔,其中N为硬币数量(2<=N<=1000), K为满足的权重数(1<=K<=100)。下面的2K行描述了所有的权重。第一个数字是Pi (1<=Pi<=N/2),表示放置在左边和右边的硬币中硬币的数量,然后是放置在左边盘子里的硬币的Pi标识符和放置在右边盘子里的硬币的Pi标识符。所有的数字都用空格隔开。第二行包含以下字符之一:'<'、'>'或'='。它表示权重的结果:

    “<”是指左边的硬币的重量小于右边的硬币的重量,

    >的意思是,左边的硬币的重量比右边的硬币的重量要大,

    “=”意思是左边的硬币的重量等于右边的硬币的重量。

    在输出文件中写入错误硬币的标识符,如果它不能被给定权重的结果发现,则输出0。

    也就是说N个硬币,有一个假硬币,现在给出了K次测量的结果,每一次的前K个标号的硬币表示放在左侧,后K个标号的硬币表示放在右侧,并且给出了测量结果。如果是等号,表示本次测量的所有硬币都是真的,如果出现了不等号,那么假硬币一定在本次测量的硬币中。但是这个假硬币可以是轻一点的,也可能是重一点的,这不确定。

    算法思想:设coin[i]表示第i个硬币的真假,全部初始化为false。首先,如果有称出是相等的,那么两边的硬币肯定都是真币 coin[i]设为true( 两边硬币一样多,N个里只有一个是假币,所以平衡了两边肯定都是真币)。然后把每次不等的情况先记录下来,由于不知道假硬币是比真硬币轻还是重,我们可以分为轻的一端的硬币,和重的一端的硬币,分别对应的qCoin[i]++,wCoin[i]++,最后找到coin[i]为false并且对应的qCoin[i]或者是wCoin[i]等于不等号出现的次数nEqual的硬币,该硬币就是假硬币。最后判断是否只找到了一个假硬币,找到,输出编号,否则输出0。

     1 #include<iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int n,k;
     6     cin>>n>>k;
     7     bool*coin=new bool[n+1];
     8     int *qCoin=new int[n+1];
     9     int *wCoin=new int[n+1];
    10     for (int i = 1; i < n+1; i++)
    11     {
    12         coin[i]=false;
    13         qCoin[i]=0;
    14         wCoin[i]=0;
    15     }
    16     int comareCoinNum,nEqual=0;
    17     for (int i = 0; i < k; i++)
    18     {
    19         cin>>comareCoinNum;
    20         int *temp=new int[2*comareCoinNum];
    21         for (int i = 0; i < 2*comareCoinNum; i++)
    22         {
    23             cin>>temp[i];
    24         }
    25         char c;
    26         cin>>c;
    27         if(c=='=')
    28         {
    29             for (int i = 0; i < 2*comareCoinNum; i++)
    30                 coin[temp[i]]=true;
    31         }
    32         else if(c=='<')
    33         {
    34             for (int i = 0; i < comareCoinNum; i++)
    35                 qCoin[temp[i]]++;
    36             for (int i = comareCoinNum; i < 2*comareCoinNum; i++)
    37                 wCoin[temp[i]]++;
    38             nEqual++;
    39         }
    40         else
    41         {
    42             for (int i = 0; i < comareCoinNum; i++)
    43                 wCoin[temp[i]]++;
    44             for (int i = comareCoinNum; i < 2*comareCoinNum; i++)
    45                 qCoin[temp[i]]++;
    46             nEqual++;
    47         }
    48     }
    49     int fCoin=0,t;
    50     for (int i = 1; i < n+1; i++)
    51     {
    52         if((coin[i]==false) && (nEqual==qCoin[i]||nEqual==wCoin[i]))
    53         {
    54                 fCoin++;
    55                 t=i;
    56         }
    57     }
    58     if(fCoin==1)
    59         cout<<t<<endl;
    60     else
    61         cout<<0<<endl;
    62     return 0;
    63 }
  • 相关阅读:
    元素的属性
    表单
    Array数组类
    string类
    js数据类型以及原型分析
    this
    有关兼容性的解决
    单位
    滚动条 和 背景位置及绝对定位
    圣杯布局 和 双飞翼布局
  • 原文地址:https://www.cnblogs.com/DA799422035/p/8995642.html
Copyright © 2011-2022 走看看