8.3贪心策略例题:快速渡河问题

快速渡河:
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 }

猜你喜欢

转载自www.cnblogs.com/z1110/p/12727000.html