过河问题
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
5
-
描述
-
在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。
-
输入
-
第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
输出
- 输出所有人都过河需要用的最少时间 样例输入
-
1 4 1 2 5 10
样例输出
-
17
来源
- POJ 上传者
解题思路:
现在假设n个人的过河时间已经从小到大排好序用数列 a1 ,a2 ,a3 ,a4 ,... , an ;
当(n <= 2) ans = a[n] ;
当(n > 2) 时:
(1) n 是偶数
a3 ,a4 怎么过
肯定是a1 , a2 先过去再a1回来。
(a)a1和a3 一起过,再a1回来和a4一起过 。
总时间 time1 = a1 + a3 + a1 + a4 ;
(b)a3和a4一起过再a2回来和a1一起过。
总时间 time2 =a1 + a4 + a2 + a2 ;
time = min(time1 , time2) ;
(2) n 是奇数两两一起过会有一个人打单。
现在的问题是a3打单还是an。
现在假设 n = 5 .
a5打单 time1 = min((a1 + a4 + a2 + a2 ) ,(a1 + a3 + a1 + a4) ) + a1 + a5
a3打单 time2 = min((a1 + a5 + a2 + a2 ) , (a1 + a4 + a1 + a5)) + a1 + a3 ;
比较time1 和 time2
当 time1 = a1 + a1 + a2 + a2 + a4 + a5 ;
teim2 = a1 + a1 + a2 + a2 + a3 + a5 ;
所以a3打单好。
得出要从后面开始 。
01.
import java.util.Arrays;
02.
import java.util.Scanner;
03.
04.
public
class
Main {
05.
06.
public
static
void
main(String[] args) {
07.
08.
Scanner sc=
new
Scanner(System.in);
09.
int
T =sc.nextInt();
10.
while
(T-->0){
11.
int
N =sc.nextInt();
12.
int
a[]=
new
int
[N];
13.
14.
for
(
int
i=0; i<N; i++)
15.
a[i]=sc.nextInt();
16.
int
sum=0;
17.
Arrays.sort(a);
18.
19.
if
(N<=2){System.out.println(a[N-1]);
continue
;}
20.
if
(N==3){System.out.println(a[0]+a[1]+a[2]);
continue
;}
21.
22.
sum =a[1];
//第一次肯定是a1,a2先过去。
23.
24.
for
(
int
i=N-1; i>=3; i-=2){
25.
26.
sum +=Math.min(a[0]+a[i]+a[0]+a[i-1], a[0]+a[1]+a[i]+a[1]);
//此处如果为奇数少个a[2]
27.
28.
}
if
(N%2==1)sum +=a[2]+a[0];
//奇数的时候,加上a[2]的时间
29.
30.
System.out.println(sum);
31.
}
32.
}
33.
}
-
第一行是一个整数T(1<=T<=20)表示测试数据的组数