题意就是说有一群细胞一样的东西,2个重量分别为a和b的细胞碰撞后重量就会变成2*sqrt(a*b),问你依次碰撞最终变成一个细胞时的最小重量。
策略是贪心策略,看题解有的人列了一堆公式,好复杂的
其实就是一点:“最大的数,肯定要开最多次方,才能使得结果最小”
然后用优先队列做就ok了
#include<iostream>
#include<string>
#include<queue>
#include<cmath>
using namespace std;
int main()
{
int n,i;
double a,x,y,z;
priority_queue<double>q;
cin>>n;
for(i=0;i<n;i++)
{
scanf("%lf",&a);
q.push(a);
}
while(q.size()!=1) //队列里如果只剩一个了就退出
{
x=q.top();//取出队里最大的两个元素
q.pop();
y=q.top();
q.pop();
z=2*sqrt(x*y); //计算后再放回去
q.push(z);
}
printf("%.3lf\n",q.top());
}