第一問二分答案
第二問dp需優化空間和時間
坑了一天 才寫出個坑爹坑爹程式
programhehe;
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...