複製書稿 book 區間DP 貪心

2021-09-19 06:58:54 字數 1578 閱讀 6550

複製書稿(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...