问题描述:
有n个人,第i个人重量为wi。每艘船的最大载重量均为C,且最多只能乘两个人。用最少的船装载所有人。
思路分析:
首先将每个人的重量数组进行排序,然后安排瘦的和胖的坐在一艘船上(使用开始指针和结束指针即可),使船只使用最大化。若排序后的w[0]>C,则直接返回人数即为所需船只的数量。
具体见代码注释:
import java.util.Arrays;
import java.util.Scanner;
public class Ccwt {
//乘船问题
//有n个人,第i个人重量为wi。每艘船的最大载重量均为C,
// 且最多只能乘两个人。用最少的船装载所有人。
public static int solve(int []w,int C)
{
int n=w.length;//人数
int st=0;//定义开始和结束指针
int et=w.length-1;
int out=0;//要返回的船只的个数
while(n>0)
{
if (w[st]>=C)//若最小的人的重量大于C
{
out=w.length;
break;
}
if (w[st]+w[et]<=C)//若开始和结束的重量小于C
{
out++;
n-=2;
st++;
et--;
}
else//若开始和结束的重量大于C
{
out++;
et--;
n--;
}
}
return out;
}
public static void main(String[] args) {
Scanner a=new Scanner(System.in);
int n=a.nextInt();//输入人数n
int []w=new int[n];//输入每个人的重量
for (int i = 0; i <n ; i++) {
w[i]=a.nextInt();
}
Arrays.sort(w);//对体重进行排序
int C=a.nextInt();//输入最大载重量
int out=solve(w,C);
System.out.println(out);
}
}
运行结果如下:

本文介绍了一种解决乘船问题的高效算法。该问题设定为:有n个人,每个人有不同的重量,每艘船的最大载重量为C,且每船最多载两人。目标是使用最少的船只装载所有人。通过排序并匹配最轻与最重的人同船,实现船只使用的最优化。
&spm=1001.2101.3001.5002&articleId=105907501&d=1&t=3&u=2bb6a5b6708543ce8b8f82a7bdc5f6b4)
3757

被折叠的 条评论
为什么被折叠?



