二分 CodeVS3162 抄書問題

2021-07-11 15:52:20 字數 2323 閱讀 1613

description 題目描述

現在要把m

mm本有順序的書分給k

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

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

input 輸入

第一行兩個整數m、k

m、km、

k;(0≤k

≤m

≤500

)(0≤k≤m≤500)

(0≤k≤m

≤500

)第二行m

mm個整數,第i

ii個整數表示第i

ii本書的頁數。

output 輸出

共k

kk行,每行兩個正整數,第i

ii行表示第i

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

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

sample input 樣例輸入

9 3

1 2 3 4 5 6 7 8 9

sample output 樣例輸出

1 5

6 78 9

limits 限制

詳見試題

time limit : 1s1s

1s& memory limit : 128mb

128mb

128m

b

第一次見到這題是考試的時候

不會啊!!!

什麼都沒輸出,得了10分(rp就這麼用光了…)

首先可以dp做

d p[

i][j

]dp[i][j]

dp[i][

j]表示前i

ii頁書被j

jj個人抄,抄寫最多的頁數

d p[

i][j

]dp[i][j]

dp[i][

j]=m in

(max

(dp[

k][i

−1],

sum[

k+1,

i]))

min(max(dp[k][i-1],sum[k+1,i]))

min(ma

x(dp

[k][

i−1]

,sum

[k+1

,i])

)輸出貪心思路搞定

上**

#include

#include

#define maxn 1100

using

namespace std;

int dp[maxn]

[maxn]

;int ans[maxn][2

];int n,k,m,i,j;

int p,q,cnt;

int a[maxn]

;int sum[maxn]

;int

mymax

(int a,

int b)

intmain()

for(m=

2;m<=k;m++

)for

(i=1

;i<=n;i++

)for

(j=1

;jp=n,q=k;

for(i=n;i>=

1;i--)}

ans[1]

[0]=

1;ans[1]

[1]=p;

for(

int i=

1;i<=k;i++)if

(ans[i][0

]&&ans[i][1

])printf

("%d %d\n"

,ans[i][0

],ans[i][1

]);return0;

}

但是有點卡時……

正解是二分答案,類似 noip 2015 跳石頭的思路。

code

引用學長一句話:

男人,要直面自己的弱點…

codevs 3162 抄書問題

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

codevs3162 抄書問題

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

codevs 3162 抄書問題

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