每次合并最大的两个,优先级队列维护一下。
输出的时候%.3lf G++会WA,C++能AC,改成%.3f,都能AC。
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<algorithm> using namespace std; int n,s; priority_queue<double>Q; int main() { while(~scanf("%d",&n)) { while(!Q.empty())Q.pop(); for(int i=1; i<=n; i++) { double x; scanf("%lf",&x); Q.push(x); } s=n; if(s==1)printf("%.3f ",Q.top()); else { while(1) { double num1=Q.top(); Q.pop(); s--; double num2=Q.top(); Q.pop(); s--; Q.push(2*sqrt(num1*num2)); s++; if(s==1) { printf("%.3f ",Q.top()); break; } } } } return 0; }