小白鼠
时间限制: 1秒 内存限制: 64M
Description
有 n 个瓶子,已知其中有且仅有一个瓶子的饮料有毒。现在我们想知道哪个瓶子的饮料有毒,于是找来一些小白鼠做测试。
假设我们有足够多的小白鼠,为了加快测试速度,我们每次可以把来自若干个瓶子的测试样本混在一起,喂给小白鼠。如果小白鼠喝了有毒的饮料,即死。
现在给你每个瓶子的饮料有毒的概率(和总是 100% ),问以最优策略(测试次数尽可能少)执行,期望的测试次数是多少?
Input
输入第一行为数据组数 T ( T <= 20 )。
对于每组数据,首先是一个空行,接下来的第一行为瓶子的个数 n ( 1 <= n <= 100 )。
再接下来的一行为 n 个实数 p1... pn ,表示每个瓶子中的饮料有毒的概率( sum{ pi |1 <= i <= n } = 1 )。
Output
对于每组数据输出一个数,为期望的测试次数,小数点后保留两位数字。
Sample input
3
3
0.5 0.25 0.25
4
0.25 0.25 0.25 0.25
2
0.00 1.00
Sample output
1.50
2.00
1.00
Hint
概率为 0 的事件未必是不可能事件,比如说在数轴上随机选点,结果选中了一个整点 ……
所以第三组样例还是需要测一次的。
参考的伟神blog: http://blog.csdn.net/zhangwei1120112119/article/details/8549066
zhangwei1120112119的专栏
BIT1020 小白鼠#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b){
return (*(double *)a) > (*(double *)b)?-1:1;
}
int main(){
int T;// T <= 20
int n; // n <= 100,栈顶
int i;
double priority_Q[120],ans;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i = 0; i < n; ++i){
scanf("%lf",&priority_Q[i]);
}
ans = 0.0;
while(n!=1){
qsort(priority_Q,n,sizeof(double),cmp);
ans += priority_Q[n-2] + priority_Q[n-1];
priority_Q[n-2] += priority_Q[n-1]; ;
--n;
}
printf("%.2lf\n",ans);
}
return 0;
}