8.9乘船问题

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

求需要船的数量
 */

思路:
先把每艘船的重量进行从小到大的排序,定义两个变量分别指向第一艘船和最后一艘船的下标,如果剩余人数 > 0:
指向的两个人重量相加如果小于等于C,那么两个变量指向更新,剩余人数 -= 2,需要船只+1,否则就是大于C那么右边指向的人单独坐一艘船,人数-1且指向更新。

 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 
 4 public class Eight_9乘船问题 {
 5 
 6     public static void main(String[] args) {
 7         Scanner in = new Scanner(System.in);
 8         int n = in.nextInt();
 9         int[] w = new int[n];
10         for(int i = 0; i < 10; i++){
11             w[i] = in.nextInt();
12         }
13         int c = in.nextInt();
14         
15         Arrays.sort(w);
16         int cntOfPerson = n;
17         int cntOfBoat = 0;
18         int p1 = 0;
19         int p2 = n-1;
20         while(cntOfPerson > 0){
21             if(w[p1]+w[p2] >= c){
22                 p2--;
23                 cntOfPerson--;
24                 cntOfBoat++;
25             }else{
26                 p1++;
27                 p2--;
28                 cntOfPerson -= 2;
29                 cntOfBoat++;
30             }
31         }
32         System.out.println(cntOfBoat);
33     }
34 }
原文地址:https://www.cnblogs.com/z1110/p/12785690.html