1. 程式人生 > >NYOJ--47 過河問題

NYOJ--47 過河問題

描述

在漆黑的夜裡,N位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,N個人一共只帶了一隻手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,N人所需要的時間已知;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,如何設計一個方案,讓這N人儘快過橋。

輸入

第一行是一個整數T(1<=T<=20)表示測試資料的組數
每組測試資料的第一行是一個整數N(1<=N<=1000)表示共有N個人要過河
每組測試資料的第二行是N個整數Si,表示此人過河所需要花時間。(0

輸出

輸出所有人都過河需要用的最少時間

樣例輸入

1
4
1 2 5 10

樣例輸出

17

解題思路
輸入後按照耗時從小到大排序.
n = 1,直接過,time = a[0];
n = 2,直接過,time = max(a[0],a[1]);
n = 3,最小耗時 和 最大耗時一起過,然後最小耗時回來,兩人一起過,time = a[0]+a[1]+a[2];

n >=4,兩種過橋辦法:
1> 耗時最小和最大耗時過去,最小耗時回來,然後剩下的人中耗時最大和耗時最小一起過,time = a[0]*2+a[n-1]+a[n-2];
2> 耗時排在前面的兩個人過去,然後耗時最小的回來,耗時最大的兩個人過去,耗時第二小的回來.time = a[0]+a[1]+a[n-1];
兩者比較,用耗時比較小的.然後兩人兩人過,到最後剩下不足四人,按照上邊n<4的情況處理.

AC程式碼

import java.util.Arrays;
import java.util.Scanner;

public class ACM47 {

    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int n = sc.nextInt();
        while(n-->0){
            int p = sc.nextInt();
            int[] t = new int[p];
            for
(int i = 0; i<p;i++){ t[i]= sc.nextInt(); } Arrays.sort(t); int time = 0; while(p>3){ time+=Math.min(t[1]+t[0]+t[p-1]+t[1],t[p-1]+t[0]+t[p-2]+t[0]); p-=2; } if(p==1){ time +=t[0]; } else if(p==2){ time += t[1]; } else if(p==3){ time += t[1]+t[0]+t[2]; } System.out.println(time); } sc.close(); } }