POJ 1862 Stripies

本文解析了一个关于如何通过特定的数学操作来最小化一组数乘积的问题,并给出了详细的算法实现过程。通过不断地将两个最大的数进行运算,可以有效地减少最终乘积的大小。

http://acm.pku.edu.cn/JudgeOnline/problem?id=1862

 

 

/*

为什么每次都要找两个最大的用公式算得出的最后的结果会是最小的:

把结果的表达式写出来就知道了 (目的是把大的数多开几次方)

结果是2^(s-1)*a1^t1*a2^t2*...as^ts   且t1+t2+...ts=1(这个是关键)

所以要让t1尽量小(设ai>aj 当 i>j时)   所以每次都要让a1 参与运算    然后尽量让a2参与运算 然后是a3, a4...

*/

 

#include <iostream>

#include <cmath>

#include <cstdio>

#include <algorithm>

 

using namespace std;

 

double a[110];

 

int main()

{

         int n,i,c;

         while(cin>>n)

         {

                   for(i=0;i<n;i++) cin>>a[i];

                   sort(a,a+n);

                   c=n-1;

                   while(1)

                   {

                            if(c==0){printf("%.3lf\n",a[0]);break;}

                            a[c-1]=2*sqrt(a[c]*a[c-1]);

                            c--;

                   }

         }

}

转载于:https://www.cnblogs.com/goodness/archive/2010/03/05/1678895.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值