poj1029 False coin

Posted Angel_Q

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于poj1029 False coin的主要内容,如果未能解决你的问题,请参考以下文章

1029 False coin

POJ1742 Coins(男人八题之一)

Poj 1029

hdu 2844 poj 1742 Coins

POJ 3210 : Coins

POJ 3440 Coin Toss(概率公式)