對於這道題目的兩問,第一問直接二分答案求出最短長度。關鍵在於第二問應當如何求:建立dp方程,dp[i][j]代表到第i個分界線,切了j次(強制在第i處切一刀、這樣就不會對後面的狀態產生影響)。狀態轉移的方程即是當前分界線列舉上一條分界線在**,上一條分界線與當前線之間如果相差不超過之前二分出來的答案,就可以判定合法,方案數累加。因為注意到合法的分界線必然是一段連續區間,且單調右移不減,所以使用乙個佇列來維護佇列內的元素總值。雖然讓我感到非常玄學的是明明資料很小,我的陣列一開小了就wa?不是很理解……
#include usingnamespace
std;
#define maxn 5000000
#define maxm 300000
#define mod 10007
#define inf 99999999
int m, maxx, fans, ans, a[maxn], sum[maxn], dp[maxm][3], n, pre = 0, now = 1
;int
q[maxn], tot, head, tail;
bool
mark[maxn];
intread()
while(c >= '
0' && c <= '
9') x = x * 10 + c - '
0', c =getchar();
return x *k;
}bool check(int
x) }
return
true;}
void
solve()
}void
dp()
bool flag = false
;
for(int i = 1; i <= m; i ++)
}now ^= 1, pre ^= 1
; }
}int
main()
solve();
cout
<< ans << "";
dp();
cout
return0;
}
木棍分割 HAOI2008
有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連 接處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長 度最大的一段長度最小.並將結果mod 10007。輸入檔案第一行有2個數n,m.接下來n...
HAOI2008 木棍分割
沒寫過幾道的字首和優化 dp 第一問是小學生難度的二分 第二問就直接 dp 了 設 dp i j 表示當前分割點在 i 之後,前面一共分割了 j 段的方案數 利用字首和單調性,通過二分預處理出每乙個點往前能擴充套件到的最大位置,之後字首和優化就可以啦 但是發現這個樣子空間會炸,而這個樣子還沒有辦法滾...
HAOI2008 木棍分割
description 有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連線處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長度最大的一段長度最小.並將結果mod 10007。input 輸入檔...