DP 複製書稿 book

2021-08-15 15:37:46 字數 1398 閱讀 4432

時間限制

: 1000 ms       

記憶體限制

: 65536 kb

提交數: 184    

通過數: 78 

現在要把

m本有順序的書分給

k個人複製(抄寫),每乙個人的抄寫速度都一樣,一本書不允許給兩個(或以上)的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第

一、第三和第四本書給同乙個人抄寫。

現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的時間。

第一行兩個整數m,

k;(k≤m≤500

)第二行

m個整數,第

i個整數表示第

i本書的頁數。共k

行,每行兩個整數,第

i行表示第

i個人抄寫的書的起始編號和終止編號。

k行的起始編號應該從小到大排列,如果有多解,則盡可能讓前面的人少抄寫。

9 3
1 2 3 4 5 6 7 8 9
1 5
6 7
8 9

no題目思路:

設f[i][j]為將j本書交由i個人抄寫的最短時間。

設sum[i]為前i本書的總頁數。

我們可以先列舉人數i,在列舉書本數量j,第三層將j本書分為兩部分,前一部分由i-1人抄寫,最後一部分由1個人完成。

比較這兩種情況下哪一種的書的數量比較大,

即是求出了在分割書數量不同的情況下,每次複製的時間(複製時間為抄寫頁數最多的人用去的時間)。

將這些不同分割方法的各個時間都計算出來以後,與相同階段的所有時間進行比較,取其中的最小值,這個值就是要求得的最小複製時間。

狀態轉移方程:f[i][j]=min(f[i][j],max(f[i-1][t],sum[i]-sum[t]))

邊界條件:f[1][j]=a[j]

第二問用貪心做即可。

我們已經求出最優解,所以,每個人抄的書肯定不能超過最優解,所以貪心思想即可,我們逆序讓最後乙個盡量抄即可

**實現:

#includeusing namespace std;

int n,k,a[505];

int f[505][505],i,j;

int sum[505];

int print(int i,int j)//貪心過程

for(i=2;i<=k;i++) //列舉每個人

for(j=1;j<=n;j++) //列舉書

for(int t=1;tprint(k,n);

return 0;

}

複製書稿 book 區間DP 貪心

複製書稿 book 時間限制 1 sec 記憶體限制 128 mb 題目描述 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間...

1278 複製書稿 book

現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的時間。第一行兩個整數m,k k m 50...

複製書稿 book (二分,貪心 dp)

時間限制 1 sec 記憶體限制 128 mb 提交 3 解決 1 提交 狀態 討論版 命題人 quanxing 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫...