codevs3162 抄書問題

2021-09-26 16:11:44 字數 1600 閱讀 4814

題目描述 description

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

一、第三、第四本數給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的時間。

輸入描述 input description

第一行兩個整數m、k;(k<=m<=100)

第二行m個整數,第i個整數表示第i本書的頁數。

輸出描述 output description

共k行,每行兩個正整數,第i行表示第i個人抄寫的書的起始編號和終止編號。k行的起始編號應該從小到大排列,如果有多解,則盡可能讓前面的人少抄寫。

樣例輸入 sample input

9 3

1 2 3 4 5 6 7 8 9

樣例輸出 sample output

1 5

6 78 9

資料範圍及提示 data size & hint

詳見試題

分析:

最短時間為抄寫頁數最多的時間,所以要先求最多的抄寫頁數,從中選擇最小值 

1. 設狀態:dp[i][j] — 將前i本書分給j個人抄寫需要的最短時間;

2. 初始狀態:dp[i][1] — 乙個人抄寫前i本書需要的最短時間就是前i本書的頁數

最終狀態:dp[m][k] — 將前m本書分給j個人抄寫需要的最短時間

3. 狀態轉移方程:先分配最後乙個人抄寫的頁數,求得最大值 。max(dp[i-l][j-1],sumarr[i]-sumarr[i-l]);

最後求最短時間 dp[i][j]=min 

求具體方案:

用動態規劃求得最優值後,在利用用貪心的思想,將最後一本書按逆序將書分配給k個人抄寫,從第k個人開始,如果他還能寫,就給他,直到分配完畢。

public class copybook

}//資料儲存

for (int i = 1; i <= bookpagestr.length; i++)

scanner.close();

for (int j = 2; j < k+1; j++)}}

}prinf(m, k, bookpage, dp[m][k]);

}private static void prinf(int i, int j, int bookpage, int leasttime)

t = i;

x = bookpage[i];

//從最後一本書開始分配,直到不能分配為止

while (x + bookpage[t-1] <= leasttime)

prinf(t-1, j-1, bookpage, leasttime);

system.out.println(t + " " + i);

}}

codevs 3162 抄書問題

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

codevs 3162 抄書問題

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

二分 CodeVS3162 抄書問題

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