- 贪心基础入门讲解四——独木舟问题

news/2024/5/18 16:47:45
n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人。显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?

分析: 

一个显然的策略是按照人的体重排序。

极端化贪心策略,最重的人要上船——如果最重的人和最轻的人体重总和不超过船的承重,则他们两个占用一条船。否则(因为假设最重的人的体重也不超过船的承重了),最重的人单独占一条船。转变为(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)个人的规模,从而解决这个问题。

输入

第一行包含两个正整数n (0<n<=10000)和m (0<m<=2000000000),表示人数和独木舟的承重。
接下来n行,每行一个正整数,表示每个人的体重。体重不超过1000000000,并且每个人的体重不超过m。
输出
 
一行一个整数表示最少需要的独木舟数。
 
输入示例

3 6
1
2
3

输出示例

2
 
请选取你熟悉的语言,并在下面的代码框中完成你的程序,注意数据范围,最终结果会造成Int32溢出,这样会输出错误的答案。
不同语言如何处理输入输出,请查看下面的语言说明。
#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;  
}  

如果对你有所帮助,别忘了加好评哦;么么哒!!下次见!88

转载于:https://www.cnblogs.com/cangT-Tlan/p/6219018.html


http://www.niftyadmin.cn/n/1701555.html

相关文章

老板的企业管理-五项管理

《心态管理》、《目标管理》、《时间管理》、《学习管理》《行动管理》第一部分《心态管理》1、任何限制都是从自己的内心开始的&#xff08;如果你连自己都不相信&#xff0c;你又怎么能够指望别人相信你&#xff0c;不要再给自己设限&#xff0c;那样你将白来一世&#xff0c…

配置管理小报100622:我们现在用的curisecontrol编译,由于架构上的限制,禁用了每个项目单独设定自动触发编译策略,必须得手动点一下‘build’按钮触发...

为什么80%的码农都做不了架构师&#xff1f;>>> 问题&#xff1a; 作者&#xff1a;李&#xff08;lijia.cn&#xff09;王&#xff08;zbwangjian.cn&#xff09; 我们现在用的curisecontrol编译&#xff0c;由于架构上的限制&#xff0c;禁用了每个…

1299. 将每个元素替换为右侧最大元素(简单)- LeetCode

注意这里的右边不包括该位置上的元素。 自己解法&#xff1a;动态规划 设新列表为res&#xff0c;原列表为arr&#xff0c;初始状态为&#xff1a; res[-1] -1res[-2] arr[-1] 下标从len(arr) - 2递减至0&#xff0c;转移方程为&#xff1a; if arr[i1] > res[i1]:re…

linux设备模型:扩展篇

Linux设备模型组件&#xff1a;总线 一、定义:总线是不同IC器件之间相互通讯的通道;在计算机中,一个总线就是处理器与一个或多个不同外设之间的通讯通道;为了设备模型的目的,所有的设备都通过总线相互连接,甚至当它是一个内部的虚拟总线(如,platform总线);例如,设备模型表示在…

十分钟掌握Nodejs下载和安装

Nodejs安装教程 第一步&#xff1a;下载node.js 第一步&#xff1a;到node官网下载node.js 1、下载官网推荐的版本&#xff0c;网址&#xff1a;https://nodejs.org/en/download/ 第二步&#xff1a;根据需要选择自己需要的版本 1、网址&#xff1a;https://nodejs.org/do…

python之redis和memcache操作

Redis 教程 Redis是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据库&#xff0c;高速缓存和消息队列代理。Redis 是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库。它支持字符串、哈…

《Python编程:从入门到实践》第十章笔记

10.1 从文件中读取数据 10.1.1 读取整个文件 先创建一个文件&#xff0c;包含精确到小数点后30位的圆周率值&#xff0c;且在小数点后每10位处都换行&#xff1a; 3.141592653589793238462643383279下面的程序打开并读取这个文件&#xff0c;再将其内容显示在屏幕上&#xf…

Citrx XenDesktop 7 实施二 安装XenServer

安装XenServer. XenServer 是基本,虽然,我们可以把XenDesktop 安装在ESXI和Hyper-V上面.但是,兼容性还有便捷性,都没有在XenServer上面好.所以,虽然我自己也很不喜欢XenServer.但是,考虑到这些.还是老老实实的安装吧.1.说心里话,我最不想写的就是关于系统安装之类的东西.觉得特…