Poj 1862 Stripies【贪心+数学】

题意:

给出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 
#include 
#include 
#include 
using namespace std;
double a[105];
int main(){
    int n;
    cin>>n;
    for(int i=0;i>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<


你可能感兴趣的:(OJ)