水题,每次从n个数中取两个合成一个假设第一个数是a,第二个是b,合成一个新的数m,m=2*sqrt(a*b),一直取到只有一个数。稍微想下每次怎么取最下就行。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue<double>q;
int main()
{
int n;
double num;
while(scanf("%d",&n)!=EOF)
{
while(!q.empty())
q.pop();
for(int i=0;i<n;i++)
{
scanf("%lf",&num);
q.push(num);
}
double ans=q.top();//n=1的情况
while(q.size()>1)
{
double x=q.top();
q.pop();
double y=q.top();
q.pop();
ans=2*sqrt(x*y);
q.push(ans);
}
printf("%.3f\n",ans);
}
return 0;
}