**渡河
时限: 1000MS 内存限制: 10000K
提交总数: 26497 接受: 9760
描述
一群N人希望只乘一条船穿过一条河,最多只能载两个人。因此,必须安排某种穿梭装置以便来回划船,以便所有人都能穿过。每个人都有不同的划船速度;一对夫妇的速度取决于较慢者的速度。您的工作是确定使这些人相处的时间最短的策略。
输入值
输入的第一行包含一个整数T(1 <= T <= 20),即测试用例的数量。然后是T例。每个案例的第一行包含N,第二行包含N个整数,给出每个人过河的时间。每个案例前面都有一个空白行。人数不会超过1000,而且没有人花费超过100秒的时间穿越。
输出量
对于每个测试用例,打印一行,其中包含所有N个人穿过河流所需的总秒数。
**
输入:
1个
4
1 2 5 10
输出:
17
分析:
时间最短取决于划船速度较慢者,假设每次只让最慢速度的两个人回来,有两种方式:
第一种:最快+最慢去,最快回;最快+次慢去,最快回。
第二种:最快+次块去,最快回;最慢+次慢去,次快回。
按照从小到大排序好,时间如下:T(1) =V(最慢)+V(次慢)+2V(最快)
T(2)=2V(次快)+V(最快)+V(最慢)
代码如下:
package it;
import java.util.Arrays;
import java.util.Scanner;
public class PO1700{
private static int answer;
private static int N;
private static int arr[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int t=0;t<T;t++) {
N = sc.nextInt();
arr=new int[N];
answer = 0;
for(int i=0;i<N;i++) {
arr[i]=sc.nextInt();
}
Arrays.sort(arr);
getOpt();
System.out.println(answer);
}
sc.close();
}
private static void getOpt() {
for(int i=arr.length-1;i>=0;) {
if(i==0) {
answer+=arr[0];
break;
}
if(i==1) {
answer+=arr[1];
break;
}
if(i==2) {
answer+=arr[0]+arr[1]+arr[2];
break;
}
int a=2*arr[0]+arr[i]+arr[i-1];
int b=2*arr[1]+arr[0]+arr[i];
answer+=Math.min(a, b);
i=i-2;
}
}
}