【贪心】Stripies POJ 1862

题目描述: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
",q.top()); 
	}
}
原文地址:https://www.cnblogs.com/Orz-IE/p/12039516.html