1. 程式人生 > >過河問題 貪心

過河問題 貪心

開始 難度 pac map sca 的人 names 最優 sort

過河問題

時間限制: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<iostream>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include
<fstream> #include<memory> #include<list> #include<string> using namespace std; typedef long long LL; typedef unsigned long long ULL; #define MAXN 1005 #define INF 1000000009 /* 過橋問題 單獨過橋時間已知,兩人同時過橋 時間為較慢的那人的時間 只有一個手電筒 1 2 5 10 一開始的思路是讓跑的最快的人來回送手電 ,但是最優解是兩個最慢的同時過河 T1 T2 T3 T4 1來回送 T2+T1+T3+T1+T4 2*T1+T2+T3+T4 兩個慢的同時過 T1+T2+T4+T2+T2 3*T2+T1+T4 結論:如果(T1+T3)大於2T2,第二種方法優;如果(T1+T3)小於2T2,第一種方法優;如果(T1+T3)等於2T2,兩種方法無差異。 當 n< 4 T1 T2 T3 T1+T2+T3 T1 T2 T2
*/ int T, n, ans, Time[MAXN]; int main() { scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &Time[i]); sort(Time, Time + n); ans = 0; while(n >= 4)//time[n-4] n-3 n-2 n-1 { ans += min(Time[n - 1] + Time[n - 2] + 2 * Time[0], Time[0] + Time[1] + Time[n - 1] + Time[1]); n -= 2; } if (n == 1) ans += Time[0]; else if (n == 2) ans += Time[1]; else ans += Time[0]+Time[1]+Time[2]; printf("%d\n", ans); } return 0; }

過河問題 貪心