您的位置:首页 > 其它

Poj 1862 Stripies【贪心+数学】

2017-09-23 20:29 267 查看
题意:

给出n 个物体,分别给出每个的质量,并且两个物体(假设质量分别为m1,m2)相撞的时候变成一个物体,质量为2*sqrt(m1*m2),并且只会出现两个两个物品碰撞的情况,问最终能得到的物体的最小质量是多少。

题解:

贪心策略如下:

类似于哈弗曼树的方法,每次选举两个当前最大的数值进行运算,直到剩下一个物品。

贪心证明如下:

假设三个物体,质量分别为 a,b,c,(a>=b>=c)可以证明:

2*sqrt(2*c*sqrt(a*b)) <=2*sqrt(2*a*sqrt(b*c)) 

证明三个元素每次选举两个最大质量是最优的选取方法,类推到n,依然成立,证毕。

#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
double a[105];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
double ans=a[n-1];
for(int i=n-2;i>=0;i--)
ans=2*sqrt(ans*a[i]);
cout<<setprecision(3)<<fixed<<ans<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm poj