ny过河问题

过河问题

时间限制: 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. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值