朱迪過河

朱迪過河 (river.pas/c/cpp)
【問題描述】
兔警官朱迪歷經千辛萬苦,終於找到了被獅市長關押的夥伴們,打算馬上把她們帶回去與家人團聚。
兔警官朱迪帶着被她解救出來的 N 個小夥伴打算過一條河,但她們僅有的渡河工具就是一個木筏。
由於其她小夥伴都不會划船,在整個渡河過程中,兔警官朱迪必須始終在木筏上。在這個基礎上,木筏上的小夥伴數目每增加1個,朱迪就得花更多的時間才能把木筏劃到對岸。
當朱迪一個人坐在木筏上,她把木筏劃到對岸需要 M 分鐘。當木筏搭載的小夥伴數目從i-1增加到i(1≤i≤N)時,朱迪得多花M_i分鐘才能把木筏劃過河(也就是說,船上有1個小夥伴時,朱迪得花M+M_1分鐘渡河;船上有2個小夥伴時,時間就變成M+M_1+M_2分鐘,後面的依此類推)。那麼,朱迪最少要花多少時間,才能把所有的小夥伴帶到河的對岸呢?當然,這個時間得包括朱迪一個人把木筏從對岸劃回來接下一批小夥伴的時間。
【輸入格式】
第1行: 2個用空格隔開的整數:N 和 M;
第2..N+1行: 第i+1行爲一個整數:M_i;
【輸出格式】
輸出共一行一個整數,爲兔警官朱迪把所有的小夥伴都載過河所需的最少時間;
【輸入樣例】
5 10
3
4
6
100
1
【輸出樣例】
50
【輸入說明】兔警官朱迪帶了5個小夥伴準備過河。如果是單獨把木筏劃過河,朱迪需要花10分鐘,帶上1個小夥伴的話,是13分鐘,2個小夥伴是17分鐘,3個是23分鐘,4個是123分鐘,將5個小夥伴一次性載過去,花費的時間是124分鐘。
【輸出說明】朱迪第一次帶3個小夥伴過河(23分鐘),然後一個人劃回來(10分鐘),最後帶剩下的2個小夥伴一起過河(17分鐘),總共花費的時間是23 + 10 + 17 = 50分鐘。
【數據規模】
對於30%的數據: 1≤N≤50;
對於60%的數據: 1≤N≤500;
對於100%的數據:1≤N≤5,000;1≤M≤1,000;1≤M_i≤1,000;

因爲最優解一定是至多隻有一趟半(去->回->去),所以所有過程中可以用動態規劃思想。狀態轉移方程爲 f[i]=min(f[i],f[j]+v[i-j]+v[0]); i是帶走的總人數花費,j是去時帶的人數花費,i-j就是回去時的花費,當然別忘了朱迪也有花費要+v[0],發現兩趟往返,多加了一個V[0],減去就好了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,x;
int v[1005],f[5005];
int main(){
    cin>>n>>m;
    v[0]=m;
    for (int i=1;i<=n;i++)
    {
        cin>>x;
        v[i]=v[i-1]+x;
    }
    memset(f,127/3,sizeof(f));
    f[0]=0;
    for (int i=1;i<=n;i++)
     for (int j=0;j<i;j++)
     f[i]=min(f[i],f[j]+v[i-j]+v[0]);
     cout<<f[n]-v[0];
     return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章