【贪心】Stripies POJ 1862

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ike940067893/article/details/75172922

题目描述:http://poj.org/problem?id=1862

题目大意:你有n个数要合并,每两个数x,y合并后得到2*sqrt(x*y)。求最后留下的一个数的最小值。

每合并一次,就会有数被开方,那么你越早合并的数被开放的次数越多,于是每次把最大的两个数合并即可。用到优先队列。

代码:

#include<cstdio>  
#include<queue>
#include<cmath>
using namespace std;  
priority_queue<double>q;  
int main()  
{  
	int n,i,tmp;  
	while(scanf("%d",&n)!=EOF)
	{
		while(!q.empty()) q.pop();
		double x,y;
		for(i=1;i<=n;i++)
			scanf("%d",&tmp),q.push(tmp);
		for(i=1;i<n;i++)
		{
			x=q.top();q.pop();
			y=q.top();q.pop();
			q.push(2*sqrt(x*y*1.0));                                           
		}  
		printf("%.3lf\n",q.top()); 
	}
}

猜你喜欢

转载自blog.csdn.net/Ike940067893/article/details/75172922