【DP】过桥
過橋
題目大意:
有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]); }總結
- 上一篇: 醋酸的化学式 醋酸的化学式是什么
- 下一篇: 怎样破手机密码 如何破解手机的密码