快速渡河:
T队人,有n个人想过河,但只有一条船,船同时最多装2个人,每一次过河,过河时间为船上用时
最多的那人的过河时间,如果还有人没有过河,那么回来1人在带人过去。问n个人过河最少要多少时间?
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Eight_3贪心策略例题_快速渡河问题 { 5 public static void main(String[] args) { 6 Scanner in = new Scanner(System.in); 7 int T = in.nextInt(); 8 for(int i = 0; i < T; i++){ 9 int n = in.nextInt(); 10 int[] speed = new int[n]; 11 for(int j = 0; j < n; j++){ 12 speed[j] = in.nextInt(); 13 } 14 Arrays.sort(speed); 15 f(n, speed); 16 } 17 } 18 private static void f(int n, int[] speed) { 19 int left = n; 20 int ans = 0; 21 while(left > 0){ 22 if(left == 1){ //只有一人 23 ans += speed[0]; 24 break; 25 }else if(left == 2){ //只有两人 26 ans += speed[1]; 27 break; 28 }else if(left == 3){ //有三人 29 ans += speed[2] + speed[0] + speed[1]; 30 break; 31 }else{ 32 //1,2出发,1返回,最后两名出发,2返回 33 int s1 = speed[1] + speed[0] + speed[left-1] + speed[1]; 34 //1,3出发,1返回,1,4出发,1返回,1,2过河 35 int s2 = speed[left-1] + speed[left-2] + 2*speed[0]; 36 ans += Math.min(s1, s2); 37 left -= 2; //左侧是渡河的起点,left代表左侧的剩余人数 38 } 39 } 40 System.out.println(ans); 41 } 42 }