DP 二分 JZOJ 3463 軍訓

2022-04-30 20:21:09 字數 2145 閱讀 8587

description

hysbz 開學了!今年hysbz 有n 個男生來上學,學號為1…n,每個學生都必須參加軍訓。在這種比較墮落的學校裡,每個男生都會有gi 個女朋友,而且每個人都會有乙個欠扁值hi。學校為了保證軍訓時教官不會因為學生們都是人生贏家或者是太欠扁而發生打架事故,所以要把學生們分班,並做出了如下要求:

1.分班必須按照學號順序來,即不能在乙個班上出現學號不連續的情況。

2.每個學生必須要被分到某個班上。

3.每個班的欠扁值定義為該班中欠扁值最高的那名同學的欠扁值。所有班的欠扁值之和不得超過limit。

4.每個班的女友指數定義為該班中所有同學的女友數量之和。在滿足條件1、2、3 的情況下,分班應使得女友指數最高的那個班的女友指數最小。

請你幫hysbz 的教務處完成分班工作,並輸出女友指數最高的班級的女友指數。

輸入資料保證題目有解。

input

第一行僅2 個正整數n, limit,分別為學生數量和欠扁值之和的上限。

接下來n 行每行2 個正整數hi,gi,分別為學號為i 的學生的欠扁值和女友數。

output

僅1 個正整數,表示滿足分班的條件下女友指數最高的班級的女友指數。

sample input

4 6

4 33 5

2 22 4

sample output

8

【樣例解釋】

分班按照(1,2),(3,4)進行,這時班級欠扁值之和為4+2=6<=limit,而女友指數最高的班級為(1,2),為8。容易看出該分班方案可得到最佳答案。

data constraint

對於20%的資料:n,limit<=100

對於40%的資料:n<=1000

對於100%的資料:1<=n,gi<=20000,1<=hi,limit<=10^7

分析由於求max-min問題,發現滿足二分性以後,可以考慮二分

然後我們想到dp判斷

fi為到i為止(不包括i)的最小欠扁值之和

然後方程容易得到:

f[i]=∑min(f[j]+max(h[j]..h[i]))

但是列舉j顯然不太現實,o(n^2)的時間複雜度

然後注意到max(f[j]..f[i])是滿足單調性的(單調下降或不變)

那麼我們設nexti為從i往後第乙個滿足hnext[i]>hi的位置

那麼顯然若i≤ji,則max(h[i]..h[j])不變

那麼我們可以直接跳過j,跳到nexti即可

時間複雜度為o(knlogn)k為常數(不會算next的時間複雜度,因為資料是可以卡掉的,如果h滿足單調上公升就可以卡住next,使k退化為n,但是顯然沒有卡【滑稽】)

#include #include 

#include

#define rep(i,a,b) for (i=a;i<=b;i++)

const

int n=20002

;using

namespace

std;

intnext[n],nstk[n];

long

long

sumofg[n],stk[n];

intn;

long

long

limit;

intg[n],h[n];

int get_right(int x,long

long

lmt)

returnl;}

bool judge(long

long

lmt)

f[j+1]=min(f[j+1],f[i]+mx);

}return f[n+1]<=limit;

}int

main()

stk[top]=2147483647

; nstk[top]=n+1

;

for (i=n;i;i--)

long

long l=1,r=sumofg[n],mid,ans=sumofg[n];

while (l

else l=mid+1

; }

printf(

"%lld

",ans);

}

view code

JZOJ 二分 抄書

與書的複製差不多 洛谷 書的複製 但是只要輸出最大的時間 樣例輸入9 3 100 200 300 400 500 600 700 800 900樣例輸出1700樣例解釋1 1500 100 200 300 400 500 2 1300 600 700 3 1700 800 900 1300 1500...

jzoj3521 道路覆蓋 二分 狀壓dp

description ar把一段凹凸不平的路分成了高度不同的n段,並用h i 表示第i段高度。現在tar一共有n種泥土可用,它們都能覆蓋給定的連續的k個部分。對於第i種泥土,它的 為c i 可以使得區間 i,min n,i k 1 的路段的高度增加e i tar要設定一種泥土使用計畫,使得使用若干...

二分 抄書 (jzoj 2123)

有n本書,分給m個人抄,每個人只能拿到連續的書 不能把一本書分開 問抄書最多的人要抄多少頁9 3 100 200 300 400 500 600 700 800 9001700對於10 的資料,有n 10 對於50 的資料,有n 500 對於100 的資料,有n 3000 這道題很可能想到dp但會炸...