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;
}
给出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;
}
相关文章推荐
- Poj 1862 Stripies【贪心+数学】
- 【原创】【合并类贪心】POJ 3253 1862 2709; Fence Repair && Stripies && Painter
- poj 1862 Stripies 数学
- POJ 1862 - Stripies(贪心)
- [POJ 1862] Stripies (贪心)
- 9 POJ 1862 Stripies 简单贪心
- 贪心 + 数学 (POJ 1862)
- 【贪心】Stripies POJ 1862
- POJ 1862 Stripies#贪心(水)
- (贪心5.2.5)POJ 1862 Stripies(利用数据有序化来进行贪心选择)
- POJ 1862 Stripies 贪心+优先队列
- poj 1862 Stripies 优先队列 贪心
- POJ 1862 Stripies 贪心+优先队列
- POJ 1862 (Stripies) 数学题
- 【简单贪心+优先队列】POJ - 1862 - Stripies
- POJ 1862 Stripies 贪心
- Stripies(POJ 1862, 贪心)
- POJ 1862 & ZOJ 1543 Stripies(贪心 | 优先队列)
- POJ 1862 & ZOJ 1543 Stripies(贪心 | 优先队列)
- POJ 1862 Stripies 【贪心】