题意:
有N堆菌落,每堆菌落都有自己的重量,现给定两堆菌落合并后的重量为2*sqrt(m1*m2),求全部合并后最小的重量。
由合并公式可以看出,最开始合并的一定是两个最大的菌落,又可以根据2*sqrt(m1*m2)结果一定大于 min(m1, m2)。
所以就不需要用优先队列来维护最大的权值了,直接从小到大排序后倒着挨个合并即可。。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <assert.h>
#include <time.h>
//#define _Test
typedef long long LL;
const int INF = 500000001;
const double EPS = 1e-9;
const double PI = acos(-1.0);
using namespace std;
int main()
{
#ifdef _Test
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
srand(time(NULL));
#endif
int N, a[1000];
while(~scanf("%d", &N))
{
for(int i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
sort(a, a+N);
double k = a[N-1];
for(int i = N - 2; i >= 0; i--)
{
k = 2*sqrt(k*a[i]);
}
printf("%.3f\n", k);
}
return 0;
}