POJ 1862 优先队列

题目大意百度来的。看不懂=.=

说科学家有奇怪生物,每两个会合并,合并后的重量为2*sqrt(m1*m2);

求最终合并的生物最小重量。

由于m1+m2>=2*sqrt(m1+m2);

所以每次在优先队列中取出2个元素,进行合并。保证最后的解最小。

题意没懂WA了一次。

#include<iostream>
#include<queue>
#include<cmath>
using namespace std;

double max( double a,double b ){ return a>b?a:b; }

int main()
{
 	int N;
 	while( scanf("%d",&N)!=EOF )
 	{
	 	   priority_queue< double,vector<double>,less<double> > PQ;
	 	   double wi;
	 	   for( int i=0;i<N;i++ )
	 	   {
		   		scanf( "%lf",&wi );
		   		PQ.push(wi);
		   }
		   double ans=PQ.top();
		   double m=0;
		   double a,b;
		   while( PQ.size()!=1 )
		   {
		   		  a=PQ.top();PQ.pop();
		   		  b=PQ.top();PQ.pop();
		   		  PQ.push( 2*sqrt(a*b) );
 		   }
 		   printf( "%.3lf\n",PQ.top() );
  	}
  	return 0;
}


你可能感兴趣的:(POJ 1862 优先队列)