题意:给出N个数m1,m2,m3...任意两个相撞会形成一个新的m,m=2*sqrt(mi*mj),求最好剩下的最小的m
思路:如果要想m最小,则要求mi,mj分别最小,递归的想下去,则应该每次保证最大的两个最开始相撞,所以用到了优先队列。
#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
int main()
{
int N,M;
double a,b,c,tmp;
priority_queue<double,vector<double>,less<double> > Q;
scanf("%d",&N);
M=N;
while(N--)
{
scanf("%lf",&a);
Q.push(a);
}
M--;
while(M--)
{
b=Q.top();
Q.pop();
c=Q.top();
Q.pop();
tmp=2*sqrt(b*c);
Q.push(tmp);
}
printf("%.3f\n",Q.top());
//system("pause");
}