题目大意:给出n个物品的质量,两个质量为m1和m2的物品碰撞后的总质量变为2*sqrt(m1*m2),问所有碰撞结束后,总质量最小是多少
输入:n (1 <= n <= 100)
第i个物品的质量mi(1 to 10000)(共n行)
输出:最小总质量(精确到小数点后三位)
分析:贪心的思想,每次取出最大质量的两个物品进行合并。因为合并后质量会变小,所以让质量大的物品尽量多的参与到开方运算中。(就是huffman树的应用)
代码:转载自https://www.cnblogs.com/jackge/p/3223079.html
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
int main(){
//freopen("input.txt","r",stdin);
priority_queue<double> q; // c++优先级队列默认从大到小
//priority_queue<double,vector<double>,greater<double>> q为从小到大
while(~scanf("%d",&n)){
while(!q.empty())//队列置空
q.pop();
double x,a,b;
for(int i=0;i<n;i++){
scanf("%lf",&x);
q.push(x);
}
while(q.size()>1){
a=q.top(); q.pop();
b=q.top(); q.pop();
x=2*sqrt(a*b);
q.push(x);
}
printf("%.3f\n",q.top());
}
return 0;
}