乘船问题

题目:
有n个人,第i个人的重量为wi,每艘船的最大载重量均为c,且最多只能乘两个人,用最少的船装载所有人。
思路:
贪心策略:考虑最轻的人i如果每个人都无法和他坐船(重量和超过c),则唯一的方案是每个人坐一艘,否则,他应该选择能和他坐船的人中最重的一个。

import java.util.Arrays;

public class 乘船问题 {
	public static void main(String[] args) {
		int[] w= {1,2,3,4,5,6,7,8,9,10};
		int n=w.length;
		int c=10;
		
		Arrays.sort(w);
		int cntOfPerson=n;
		int cntOfBoat=0;
		int p1=0;
		int p2=n-1;
		while (cntOfPerson>0) {
			if(p1+p2>c) {
				p2--;
				cntOfPerson--;
				cntOfBoat++;
			}else {
				p1++;
				p2--;
				cntOfPerson-=2;
				cntOfBoat++;
			}
		}
		System.out.println(cntOfBoat);
	}
}

### 头歌平台第一关贪心算法乘船问题解决方案 #### 问题描述 给出 n 个人,第 i 个人重量为 \( w_i \)。每最大载重量为 C,且最多只能乘两个人。目标是用最少的只装载所有人。若有解则输出所需只数量;若无解,则输出 "no"[^1]。 #### 解决思路 为了最小化使用的只数目,可以采用贪心策略来解决问题。具体来说: - 将所有人的体重按升序排列。 - 使用双指针方法,一个指向最轻的人(左端),另一个指向最重的人(右端)。 - 如果最轻和最重的人能同坐一,则安排他们一起乘坐并移动两个指针;否则只让最重的人单独乘坐一条,并仅移动右端指针。 - 当所有人都被分配到上时结束循环,此时所记录下的只总数即为最优解。 这种方法基于这样的直觉:尽可能多地利用每次运输的机会使两人共乘一能够减少总的运力需求[^2]。 #### Python 实现代码 ```python def min_boats(people, limit): people.sort() # 对人员按照体重从小到大排序 boats_needed = 0 left = 0 # 左侧索引初始化为数组起始位置 right = len(people) - 1 # 右侧索引初始化为数组末尾位置 while left <= right: if (left == right): # 若只剩余最后一个人 boats_needed += 1 break elif (people[left] + people[right] <= limit): left += 1 # 成功配对后更新左侧索引 right -= 1 # 更新右侧索引 boats_needed += 1 return boats_needed ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值