过桥
题目大意:
有n个人要过一条桥,每个人都有自己的过桥时间,一条桥同时只能有2个人过(过桥时间求较慢的一人),且要有人拿着手电筒才能过,只有一个手电筒,且不能扔手电筒,问最快要多就才能所有人都过桥
原题:
解题思路:
用f[i]来表示过去了前i个人(按过桥时间从小到大排),因为同时只能2个人过桥,所以要不就是最快的人送别人过去(先回来,然后和别人一起过去),要不就是最快的和次快的送别人过去(最快的先回来,然后两个人过去,然后再让次快的来接最快的)
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[1005],f[1005];
int main()
{scanf("%d",&n);for (int i=1;i<=n;++i)scanf("%d",&a[i]);sort(a+1,a+1+n);f[1]=a[1];f[2]=a[2];for (int i=3;i<=n;++i)f[i]=min(f[i-1]+a[1]+a[i],f[i-2]+a[1]+a[2]+a[2]+a[i]);//一个人送的就直接加两次//两个人送的就先回来(a[1]),然后两个人过去(a[i])然后次快的再来接最快的(a[i]*2)printf("%d",f[n]);
}