解题思路:
这一题运用的是贪心思想,不能想出,每一步的最优解存在于两种方案中,第一种是过河最短时间的人开船过来,接走一个过河时间最长的人再开船返回。第二种是过河时间最短的人开船过来,他留下,让当前两个最长过河时间的人乘船过岸,然后再让对岸最短过河时间的人开船过河将他接回。
令dp[i]为将前i个人运送过河所需要的最短时间,再列出状态转移方程
代码:
#include<bits/stdc++.h>
using namespace std;
int n,arr[100010],dp[100010];
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
cin>>arr[i];
sort(arr+1,arr+1+n);
dp[1]=arr[1];
dp[2]=arr[2];
for(int i=3;i<=n;++i)
dp[i]=min(dp[i-1]+arr[1]+arr[i],dp[i-2]+arr[1]+arr[i]+2*arr[2]);
cout<<dp[n]<<endl;
return 0;
}