Stripies POJ-1862 [贪心-其他:数学]

贪心-其他:数学

原题 Stripies POJ - 1862

中国话:PP很喜欢射箭,这天他的箭袋里装了N支箭,当他拿出两根箭的时候神奇的事情发生了,两根箭合成了一根!
并且合成的这根箭的长度为2sqrt(ab),其中a,b分别为原来那两根箭的长度,吓了PP一跳,赶紧把箭放回了箭袋。
重复上述动作,PP的箭袋中只剩下一根箭了,请问这根箭最短是多少?

//
//  Stripies_POJ1862.cpp
//  workspace
//
//  Created by PDP11 on 2021/3/29.
//
//  注意这道题应该优先对最大的两个进行合并,得到的最终结果就是最小的

//  设:n=3,三个物品的重量分比为:a,b,c, 合并之后最小重量为w。
//  则w = 2 * sqrt( a* 2 * sqrt(b * c) )
//  化简后的 w^2/8 = sqrt(a*a*b*c), 此式可得 a 取最小时 w 的值最小。
//  归纳总结,n个物品每次取最大的两个合并,总重最小。

//  另外需要注意的是,不需要用到优先队列
//  因为必然有 2*sqrt(a*b) >= min(a,b)
//  从小到大排好序,计算结果放结尾,同时数组长度减1即可

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

const int maxn=105;
double m[maxn];

int main(){
    int N;
    cin>>N;
    
    for(int i=0; i<N; i++) scanf("%lf", m+i);
    sort(m,m+N);
    
    while(--N>0){
        m[N-1]=2*sqrt(m[N]*m[N-1]);
    }
    printf("%.3f", m[0]);
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值