poj1862

碰撞合并最小重量算法

一、题意:两个物体m1、m2相撞后会变成一个物体,这个物体的重量会变成2*sqrt(m1*m2)。有n个物体,假设只会发生两两相撞,求最后剩下的最小重量。

二、思路:简单的贪心。越大的数开越多的次方,最后得到的一定是最小的重量。因此按重量从小到大排,假设三个物体,则最小重量=2*sqrt(m0*2*sqrt(m1*m2))。n个物体以此类推

三、代码:

 1 #include"iostream"
 2 #include"stdio.h"
 3 #include"algorithm"
 4 #include"cmath"
 5 using namespace std;
 6 int n;
 7 double num[1000];
 8 int main()
 9 {
10     while(scanf("%d",&n)==1)
11     {
12         for(int i=0;i<n;i++)
13             cin>>num[i];
14         sort(num,num+n);
15 
16         double ans=0;
17         if(n==1)
18             ans=num[0];
19         else{
20             ans=2*sqrt(num[n-1]*num[n-2]);
21             for(int i=n-3;i>=0;i--)
22             {
23                 ans=2*sqrt(num[i]*ans);
24             }
25         }
26         printf("%.3llf\n",ans);
27     }
28     return 0;
29 }
View Code

 

转载于:https://www.cnblogs.com/acm-jing/p/10023054.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值