時間限制
: 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個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫...