Description
一个夜晚一些旅行者想要过桥. 他们只有一个火把. 火把的亮光最多允许两个旅行者同时过桥. 没有火把或者多于2个人则不能过桥.每个旅行者过桥都需要特定的时间, 两个旅行者同时过桥时时间应该算较慢的那个. 我们想知道所有旅行者最少要花费多少时间才能全部过桥? Example 假如有4个人. 他们分别需要花费6,7,10,15分钟过桥.下图演示了他们如何使用44分钟全部过桥的,但他们能做得更快么?
Input
第一行一个数n 表示旅行者的总数, 1 <= n <= 100,000. 接下来n 行表示所有旅行者的过桥时间,时间从小到大排列,每个数不超过1,000,000,000.
Output
输出一个数表示最少过桥时间.
Sample Input
4
6
7
10
15
6
7
10
15
Sample Output
42
HINT
Source
题解:可以发现最优解一定是以下两种情况。
1.最快的人和最慢的人一起过去,最快的人回来
2.最快的人和次快的人一起过去,最快的人回来,然后最慢的人和次慢的人一起过去,次快的人回来。
然后dp即可。
代码:
#include<iostream>
#include<cstdio>
#define N 100010
using namespace std;
long long a[N],f[N];
int n;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
if (n==1){cout<<a[1]<<endl;return 0;}
for(int i=n-1;i>=2;i--){
f[i]=f[i+1]+a[1]+a[i+1];
if(i<=n-2)f[i]=min(f[i],f[i+2]+a[2]*2+a[1]+a[i+2]);
}
cout<<f[2]+a[2]<<endl;
}
本文探讨了一群旅行者过桥的问题,他们只有一个火把并需在有限时间内全部过桥。文章给出了两种可能的最优解策略,并通过动态规划算法实现了求解过程。

被折叠的 条评论
为什么被折叠?



