您的位置:首页 > 其它

POJ-1862-Stripies

2014-02-21 15:44 225 查看
这个题是说给你n个数,然后你每次可以合并其中的2个得到一个新的数,合并的方式为c=2*(a*b)^(1/2) 然后要求你将他们合并成一个后最后剩下的最少是多少。

不难想到每次从其中选择最大的2个进行合并操作,然后得到的新的放入里面,然后每次再取最小的2个。不过这个题交的时候只能C++能过,G++过不了,不知道为什么

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int maxn=110;
struct Node
{
double val;
bool operator < (const Node &a)const
{
return val<a.val;
}
};
int n;
priority_queue<Node> q;
int main()
{
while(scanf("%d",&n)!=EOF)
{
Node node;
for(int i=0;i<n;i++)
{
double val;
scanf("%lf",&val);
node.val=val;
q.push(node);
}
for(int i=1;i<n;i++)
{
double a=q.top().val;
q.pop();
double b=q.top().val;
q.pop();
node.val=2*sqrt(a*b);
q.push(node);
}
printf("%.3f\n",q.top().val);
q.pop();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: