先看这个样例,解决这个问题
3
0.5 0.25 0.25
瓶子中有毒的概率为0.5,0.25,0.25
最先一定是用一只小白鼠实验0.5的那个瓶子,需要第二只白鼠(也就是说0.5那个没有的毒的情况)的概率为0.5,期望为1+0.5*1=1.5,为答案
画出图来
我画出这个图的时候反应过来了,这不就是哈夫曼树吗
构造哈夫曼树,然后算出哈夫曼树的带权路径长度
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
struct cmp
{
bool operator()(double &a,double &b)
{
return a>b;
}
};
int main()
{
int total;
cin>>total;
while (total--)
{
int n;
scanf("%d",&n);
priority_queue<double,vector<double>,cmp>Q;
double temp;
for (int i = 0; i < n; i++)
{
scanf("%lf",&temp);
Q.push(temp);
}
double ans=0;
while(Q.size()>2)
{
double ta=Q.top();Q.pop();
double tb=Q.top();Q.pop();
ans+=ta+tb;
Q.push(ta+tb);
}
ans+=Q.top();Q.pop();
ans+=Q.top();Q.pop();
printf("%.2lf\n",ans);
}
return 0;
}