/**
乘船问题:
有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 }