poj 1862 priority_queue

来源:互联网 发布:智能小区网络组建方案 编辑:程序博客网 时间:2024/05/16 10:50

题意:给出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");}