貪心算法:小船過河問題
題意:N我的過河,船每次只能坐兩我的,船載每一個人過河的所需時間不一樣t[i],每次過河的時間爲船上的人的較慢的那個,問最快的過河時間。(船划過去要有一我的劃回來)
最優選擇:
先將全部人過河所需的時間按照升序排序考慮把單獨過河所須要時間最多的兩個旅行者送到對岸去,有兩種方式:
1.最快的和次快的過河,而後最快的將船劃回來;次慢的和最慢的過河,而後次快的將船劃回來,時間:t[0]+2t[1]+t[n-1];
2.最快的和最慢的過河,而後最快的將船劃回來,最快的和次慢的過河,而後最快的將船劃回來,時間:2t[0]+t[n-2]+t[n-1]。ios
上述分析存在於至少四我的的時候,少於三我的狀況,咱們單獨討論一下就好。算法
#include <stdio.h> #include <iostream> #include <cstdlib> #include <cmath> #include <cctype> #include <string> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <set> #include <map> #include <ctime> #include <vector> #include <fstream> #include <list> #include <iomanip> #include <numeric> using namespace std; typedef long long ll; typedef unsigned long long ull; const int inf = 0x3f3f3f3f; const int N=1e3+5; int t[N]; int main() { int T,n; cin>>T; while(T--){ cin>>n; for(int i=0;i<n;i++){ cin>>t[i]; } sort(t,t+n);//排序 int sum=0,ks1,ks2; while(n>3){//條件選取 ks1=t[0]+2*t[1]+t[n-1]; ks2=t[n-1]+2*t[0]+t[n-2];//狀況列舉 if(ks1>ks2){ sum+=ks2; }else{ sum+=ks1; } n-=2; } if(n==3){//邊界討論 sum+=(t[0]+t[1]+t[2]); }else if(n==2){ sum+=t[1]; }else{ sum+=t[0]; } cout<<sum<<endl return 0; }