知识点:贪心,霍夫曼编码,优先队列,
如果想证明的话,可以自己在演草纸上面推一下式子,就知道为什么每次都要取出最大的两个数了
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <set>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
int main() {
int n;
cin >> n;
priority_queue<double> q;
for (int i = 0; i < n; i++) {
double x;
cin >> x;
q.push(x);
}
for (int i = 1; i < n; i++) {
double a = q.top(); q.pop();
double b = q.top(); q.pop();
double c = 2 * sqrt(a * b);
q.push(c);
}
printf("%.3f", q.top());
return 0;
}