ACM--贪心算法--独木舟问题
来源:互联网 发布:中国审美观的变化 知乎 编辑:程序博客网 时间:2024/04/29 06:57
51nod地址:点击打开链接
n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?
分析:
一个显然的策略是按照人的体重排序。
极端化贪心策略,最重的人要上船——如果最重的人和最轻的人体重总和不超过船的承重,则他们两个占用一条船。否则(因为假设最重的人的体重也不超过船的承重了),最重的人单独占一条船。转变为(n – 1)或者(n – 2)的问题了。
(1) 假设最重的人和最轻的人的体重和超过了船的承重,那么最优解中,显然也是最重的人单独占一条船,所以这种情况下最优解和贪心策略是相同的。
分析:
一个显然的策略是按照人的体重排序。
极端化贪心策略,最重的人要上船——如果最重的人和最轻的人体重总和不超过船的承重,则他们两个占用一条船。否则(因为假设最重的人的体重也不超过船的承重了),最重的人单独占一条船。转变为(n – 1)或者(n – 2)的问题了。
关键在于这种贪心策略是正确的。我们可以证明,最优解也可以变为这种策略。
(1) 假设最重的人和最轻的人的体重和超过了船的承重,那么最优解中,显然也是最重的人单独占一条船,所以这种情况下最优解和贪心策略是相同的。
(2) 假设最重的人和最轻的人的体重和没超过船的承重。
(2.1)如果最优解中,最重的人单独占用一条船,则可以把最轻的人也放上去,这样最优解用的船数不增加。如果最轻的人占用一条船,同样我们可以把最重的人放上去,最优解船数不增。
(2.2) 如果最优解中最重的人x和x’占用一只船(x, x’),而最轻的人y和y’占用一只船(y, y’)
我们换成(x, y) (x’,y’)
(x, y)显然没超过船的承重——因为我们假设就是如此。关键看(x’, y’)。
x’ + y’<= x’ + x 因为(x’, x)没超重,所以(x’,y’)也合法。所以换一下,最优解船数也不增。这样我们就证明了如果可能把最重的人和最轻的人放在一条船上,不会影响最优解。
反复应用这个策略,就可以把n降低为(n – 1)或者(n – 2)个人的规模,从而解决这个问题。
(2.1)如果最优解中,最重的人单独占用一条船,则可以把最轻的人也放上去,这样最优解用的船数不增加。如果最轻的人占用一条船,同样我们可以把最重的人放上去,最优解船数不增。
(2.2) 如果最优解中最重的人x和x’占用一只船(x, x’),而最轻的人y和y’占用一只船(y, y’)
我们换成(x, y) (x’,y’)
(x, y)显然没超过船的承重——因为我们假设就是如此。关键看(x’, y’)。
x’ + y’<= x’ + x 因为(x’, x)没超重,所以(x’,y’)也合法。所以换一下,最优解船数也不增。这样我们就证明了如果可能把最重的人和最轻的人放在一条船上,不会影响最优解。
反复应用这个策略,就可以把n降低为(n – 1)或者(n – 2)个人的规模,从而解决这个问题。
最后,我们来提供输入输出数据,由你来写一段程序,实现这个算法,只有写出了正确的程序,才能继续后面的课程。
输出示例
输入
第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重。接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。
输出
一行一个整数表示最少需要的独木舟数。
输入示例
3 6123
输出示例
2
思想:按从小到大先排序,然后第一个和最后一个相加,如果结果比船的载重大,那么就把指向最后一个的指针往前移动一个,第一个不动,船数加一,然后第一个和倒数第二个相加,如果比载重小,那么指向第一个的指针往后移动一个,倒数第二个指针往前移动,船数加一,以此类推。
#include<iostream>#include<cstdio>#include<algorithm>#include<queue>#include<vector>using namespace std;long people[10000];int main(){ int n,i,j,ans=0; long weight; cin>>n;//这个表示人数 cin>>weight;//这个表示船的重量 for(i=0;i<n;i++) cin>>people[i]; sort(people,people+n); for(i=0,j = n-1;i<=j;j--){ //从上往下遍历 if(people[i]+people[j]>weight){ ans++; }else{ i++; ans++; } } printf("%d",ans); return 0;}
1 0
- ACM--贪心算法--独木舟问题
- 算法:(贪心算法)-独木舟问题
- 贪心算法基础之独木舟问题 51nod 贪心教程
- 独木舟问题 贪心
- acm-背包问题(贪心算法)
- 【贪心算法】独木舟上的旅行
- 贪心算法--独木舟上的旅行
- 51nod贪心例子独木舟问题
- NYOJ 71 独木舟上的旅行 贪心算法 之 乘船问题
- ACM--贪心算法--活动安排问题
- ACM--贪心算法--活动安排问题二
- ACM--贪心算法
- ACM 贪心算法
- 1004贪心算法acm
- 1006-贪心算法acm
- ACM 贪心算法详解
- NYOJ 71 独木舟上的旅行 贪心算法
- nyoj 题目71:独木舟上的旅行 贪心算法
- DJango框架对Models操作
- python基础练习(一)——自定义函数,数学运算,命令行输入
- css实现自适应屏幕高度
- ListView和GridView实现单选效果
- jquery判断元素是否有某个属性
- ACM--贪心算法--独木舟问题
- hashmap相关
- 世界首例“换头术”将在中国进行中方团队加入
- Ubuntu下安装numpy and matplotlib
- Struts2开始使用convention-plugin实现零配置
- 深度剖析:Android_PullToRefresh
- sublime Text隐藏侧边栏等快捷键
- 【杭电-oj】-5053-the Sum of Cube(求立方和数学方法)
- python 接收C++接口字符串返回值