bzoj1044木棍分割

2022-03-30 13:24:16 字數 2395 閱讀 8980

第一問二分答案

第二問dp需優化空間和時間

坑了一天 才寫出個坑爹坑爹程式

program

hehe;

const

q=10007

;var

ans,s,min,max,n,m,i,j,k,l,t:longint;

sum,h:

array[0..50000] of

longint;

d:array[0..50000,0..1] of

integer;

function

ok(a:longint):boolean;

varf,g,cnt:longint;

begin

cnt:=0

; g:=0

;

for f:=1

to n do

begin

g:=g+h[f];

if g>a then

begin

inc(cnt);

g:=h[f];

end;

if cnt>m then

exit(false);

end; exit(true);

end;

function

ef(l,r:longint):longint;

varmid:longint;

begin

mid:=(l+r)>>1

;

if l=r then

exit(l);

if ok(mid) then

exit(ef(l,mid))

else exit(ef(mid+1

,r));

end;

function

mini(a,b:longint):longint;

begin

if a>b then

exit(b);

exit(a);

end;begin

readln(n,m);

for i:=1

to n do

begin

read(h[i]);

sum[i]:=h[i]+sum[i-1

];

if h[i]>max then max:=h[i];

s:=s+h[i];

end; min:=ef(max,s);

write(min,''

); t:=0

; s:=0;

for i:=1

to n do

if sum[i]<=min then

d[i,

0]:=1

else

break;

for l:=1

to m do

begin

j:=l and1;

s:=0

; t:=j xor 1;

for i:=1

to n do

begin

s:=s+d[i-1,j xor 1

]; k:=t;

while (k1)and(sum[i]-sum[k]>min) do

begin

s:=s-d[k,j xor 1

]; inc(t);

inc(k)

end; d[i,j]:=s mod

q;

end;

ans:=(ans+d[n,j])modq;

end;

writeln(ans);

end.

time limit: 10 sec  memory limit: 162 mb

submit: 2111  solved: 764

[submit][status][discuss]

有n根木棍, 第i根木棍的長度為li,n根木棍依次鏈結了一起, 總共有n-1個連線處. 現在允許你最多砍斷m個連線處, 砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小, 並且輸出有多少種砍的方法使得總長度最大的一段長度最小. 並將結果mod 10007。。。

輸入檔案第一行有2個數n,m. 接下來n行每行乙個正整數li,表示第i根木棍的長度.

輸出有2個數, 第乙個數是總長度最大的一段的長度最小值, 第二個數是有多少種砍的方法使得滿足條件.

3 2 1 1

1010 2

兩種砍的方法: (1)(1)(10)和(1 1)(10)

資料範圍  

n<=50000, 0<=m<=min(n-1,1000).

1<=li<=1000.

[submit][status][discuss]

home

back

BZOJ 1044 木棍分割(DP)

題意 有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結在一起,總共有n 1個連線處.現在允許你最多砍斷m個連線處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長度最大的一段長度最小。思路 令m m 1,則等價於分成m段使得m段中最長的最小,這個可...

bzoj1044 HAOI2008 木棍分割

傳送門 第一問隨便二分就過了,此處略去。第二問dp f i j 前i根木棍,砍了j刀的方案數。轉移方程很顯然,此處略去。我們可以滾掉一維。但是轉移要o n 2m 顯然要t 於是我們可以用單調佇列 字首和優化轉移,使得時間複雜度降為o nm 然後就過了。include include include ...

BZOJ 1044 HAOI2008 木棍分割

注意可以且m次,即分成m 1段。所以先讓m加上1。先做乙個簡單的二分答案算出最小的最大值。然後可以得到乙個o mn 2 的dp。發現dp可以通過字首和把時間複雜度優化為o nm 通過滾掉記錄m的那一維,把空間複雜度優化為o n include define left leftt using name...