题目描述:http://poj.org/problem?id=1862
题目大意:你有n个数要合并,每两个数x,y合并后得到2*sqrt(x*y)。求最后留下的一个数的最小值。
每合并一次,就会有数被开方,那么你越早合并的数被开放的次数越多,于是每次把最大的两个数合并即可。用到优先队列。
代码:
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
priority_queue<double>q;
int main()
{
int n,i,tmp;
while(scanf("%d",&n)!=EOF)
{
while(!q.empty()) q.pop();
double x,y;
for(i=1;i<=n;i++)
scanf("%d",&tmp),q.push(tmp);
for(i=1;i<n;i++)
{
x=q.top();q.pop();
y=q.top();q.pop();
q.push(2*sqrt(x*y*1.0));
}
printf("%.3lf
",q.top());
}
}