貪心演算法之 nyoj47過河問題
阿新 • • 發佈:2019-02-06
過河問題
時間限制: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; }