題目大意:
機器上有n個需要處理的任務,它們構成了乙個序列 把這些任務分成若干批
從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti
在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和
注意,同一批任務將在同一時刻完成每個任務的費用是它的完成時刻乘以乙個費用係數fi
請確定乙個分組方案,使得總費用最小
思路:設dp陣列表示前i個的最小花費 為了方便統計 順便加上對後面的影響
dp i = dpj +(sumtime i - sumtime j + s) * (sumcost n -sumcost j)
拆開之後斜率優化
注意到時間有可能是負的 因此斜率不單調 需要二分
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10view code#define inf 2139062143
11#define ll long long
12#define maxn 1001000
13using
namespace
std;
14 inline int
read()
1518
while(isdigit(ch))
19return x*f;20}
21ll st[maxn],sc[maxn],f[maxn];
22int
n,s,tim,hd,tl,q[maxn];
23 ll y(int i)
24int
main()
2537 j=q[res],f[i]=f[j]+(sc[n]-sc[j])*(st[i]-st[j]+tim);
38while(hd1]))*(sc[i]-sc[q[tl]])>=(y(i)-y(q[tl]))*(sc[q[tl]]-sc[q[tl-1]])) tl--;
39 q[++tl]=i;40}
41 printf("
%lld\n
",f[n]);
42 }
bzoj 2726 SDOI2012 任務安排
機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3 n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti 在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時...
BZOJ 2726 SDOI2012 任務安排
bzoj 2726 sdoi2012 任務安排 斜率優化 二分 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始...
bzoj 2726 SDOI2012 任務安排
機 器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的 若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是 各個任務...