1. 程式人生 > >貪心演算法之 nyoj47過河問題

貪心演算法之 nyoj47過河問題

過河問題

時間限制: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
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1010];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int N,i,sum=0;
		scanf("%d",&N);
		for(i=0;i<N;i++)
		scanf("%d",&a[i]);
		sort(a,a+N);
		while(N>3){//以四個人為一個單位選出區域性最優解,區域性的最優得出全域性的最優 
			if((a[1]+a[0]+a[N-1]+a[1]+a[1])<(a[1]+a[0]+a[N-1]+a[0]+a[N-2]))
			sum+=a[1]+a[0]+a[N-1]+a[1];
			else sum+=a[N-1]+a[0]+a[N-2]+a[0];
			N=N-2;
		}
		if(N==1)
		sum+=a[0];
		else if(N==2)
		sum+=a[1];
		else if(N==3)
		sum+=a[1]+a[0]+a[2];
		printf("%d\n",sum);
	}
	return 0;
}