P5914题解

· · 题解

题目传送门

思路

虽然是一个 dp 题,但思路却带有 贪心 的思想。

思路很明显,让跑的快的人多跑,加快总体速度,让跑得慢的人少跑,避免拖后腿,拉低速度。

所以可以想到两种方法,一是让最快的和最慢的一起先过去,然后让最快的人送火把。二是让最快的人与第二快的人先一起过去,然后最快的人回来,这样可以最大增多第一次来回的速度,再让最慢的两个人过去,再让第二慢的回来。这样第一种可以减小最慢的人的时间,第二种可以节省下一个第二慢的时间,所以都是可行的。

于是可以得出转移方程:f_i=\min(a_i+a_1+f_{i+1},a_{i+1}+2\times a_2+a_1+f_{i+2})

注意

注意是从小到大排序,要倒着处理。

## Code ```cpp #include<bits/stdc++.h> #define int long long using namespace std; const int maxn=1e5+7; int n,a[maxn]; int f[maxn]; int c,t,cnt; void init(int n){ f[n]=a[n]+a[1]; for(int i=n-1;i>=1;i--){ f[i]=min(f[i+1]+a[1]+a[i],a[i+1]+2*a[2]+a[1]+f[i+2]); } } signed main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } if(n==1){ cout<<a[1]; return 0; } init(n); cout<<f[3]+a[2]; } ```