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 }