题目大意:给定一些瓶子,以及每个瓶子的有毒概率,现在将几个瓶子混在一起给小白鼠实验,然后要求出最少的实验次数,找到那个有毒的瓶子。
这个题目啊,看完以后呢,是不会有什么想法的,但是只要你画一下图,你就知道它要干什么,为什么?(你按题意画画就知道了),其实本题愿意就是考察最后搜索二叉树,一个较为难想的DP题,具体的话,查查算法书~
这里就简单说一下实现吧,就是找两个最小概率的瓶子,将其放在最底层,然后将两个概率和相加,加入整个数列里面,排序后再重复上面的过程,(如果会一点离散数学的话,就有点像建立赫夫曼编码),最后序列只有1个数的时候,就完成~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define maxn 106
using namespace std;
double num[maxn];
int cmp(const void *a ,const void *b)
{//这个快排函数老是写错
return((*(double*)a-*(double*)b>0)?-1:1);
}
int main()
{
int Tcas;
scanf("%d",&Tcas);
while(Tcas--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%lf",&num[i]);
qsort(num,n,sizeof(double),cmp);
double ans = 0.0;
int top = n-1;
while(top>=2)
{
double pa = num[top];
double pb = num[--top];
ans = ans + pa + pb;
num[top] = pa + pb;
qsort(num,top+1,sizeof(double),cmp);
}
ans += num[top--];
ans += num[top];
printf("%.2lf\n",ans);
}
system("pause");
return 0;
}