複製書稿(book)
時間限制: 1 sec 記憶體限制: 128 mb
題目描述
現在要把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 56 7
8 9大聲bb 還不會
讓我頭大,有點像美麗度風景那題,後面再用貪心輸出結果,大致是這樣的思路 吧,網上題解是這麼說的
//設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]
//第二問用貪心做即可。
//我們已經求出最優解,
//所以,每個人抄的書肯定不能超過最優解,所以貪心思想即可,我們逆序讓最後乙個盡量抄即可
#include
#include
#include
#include
typedef
long
long ll;
using namespace std;
int a[
510]
;int dp[
510]
[510];
int m,k;
void
print
(int i,
int j)
x=a[j]
-a[j-1]
; t=j;
while
(x+a[t-1]
-a[t-2]
<=dp[k]
[m])
print
(i-1
,t-1);
cout<" "<}int
main()
for(
int i=
2;i<=k;i++)}
}// cout(k,m)
;return0;
}
DP 複製書稿 book
時間限制 1000 ms 記憶體限制 65536 kb 提交數 184 通過數 78 現在要把 m本有順序的書分給 k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,...
複製書稿 book (二分,貪心 dp)
時間限制 1 sec 記憶體限制 128 mb 提交 3 解決 1 提交 狀態 討論版 命題人 quanxing 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫...
1278 複製書稿 book
現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的時間。第一行兩個整數m,k k m 50...