1. 程式人生 > >任務安排(SDOI2012)斜率優化進階

任務安排(SDOI2012)斜率優化進階

題目描述

N N 個任務排成一個序列在一臺機器上等待完成(順序不得改變),這 N N 個任務被分成若干批,每批包含相鄰的若干任務。從時刻 0

0 開始,這些任務被分批加工,第 i i 個任務單獨完成所需的時間是 T i T_i
。在每批任務開始前,機器需要啟動時間S,而完成這批任務所需的時間是各個任務需要時間的總和(同一批任務將在同一時刻完成)。每個任務的費用是它的完成時刻乘以一個費用係數 C i C_i
請確定一個分組方案,使得總費用最小。


資料規模

1

N 3 1 0 5 0 S , C 512 512 T 512 1≤N≤3*10^5 0≤S,C≤512 -512≤T≤512


思路

首先,這還是個很明顯的劃分類 D P DP
直接上狀態: f [ i ] [ j ] f[i][j] 表示前i個任務分成j批的最小代價。
易得 f [ i ] [ j ] = m i n f [ k ] [ j 1 ] + ( j s + s u m T [ i ] ) ( s u m C [ i ] s u m C [ k ] ) f[i][j] = min{f[k][j - 1] + (j * s + sum_T[i]) * (sum_C[i] - sum_C[k])}
但是這個狀態已經是 O ( n 2 ) O(n^2) 級別的了
/-----------華---------麗-----------麗---------的-----------分---------割---------線-----------/
然後,我們會發現限制狀態的最大因素就是 j j
整個轉移中唯一與j有關的就是 j s “j * s”
因此,我們是否可以想辦法將它去掉呢?
考慮在第i個任務結束後重新分一組,那麼對第 i + 1 i + 1 ~ n n 個任務的影響就是加上了 ( s u m C [ n ] s u m C [ i ] ) s (sum_C[n] - sum_C[i]) * s
那麼,我們就可以將j這維狀態直接去掉
狀態就變成了: f [ i ] f[i] 表示前i個任務的最小代價
轉移: f [ i ] = m i n f [ i ] , f [ j ] + ( s u m C [ i ] s u m C [ j ] ) ( s + s u m T [ i ] ) + ( s u m C [ n ] s u m C [ i ] ) s f[i] = min{f[i] , f[j] + (sum_C[i] - sum_C[j]) * (s + sum_T[i])} + (sum_C[n] - sum_C[i]) * s


-----------華---------麗-----------麗---------的-----------分---------割---------線-----------


然後,我們又發現,這是個非常經典的 1 D / 1 D 1D/1D 動態規劃
顯然是無法通過 30 W 30W 級別的資料。
考慮優化,對於一道一維狀態的 D P DP 題,優化方向依然只有一個——轉移。
(否則把狀態優化了不就成了貪心嗎?)
如何減少重複或不必要的列舉呢?
1 j 1 < j 2 < i 1 ≤ j1 < j2 < i
則對於 i i 的決策, j 2 j_2 j 1 j_1 優等價於滿足
f [ j 2 ] + ( s u m C [ i ] s u m C [ j 2 ] ) ( s + s u m T [ i ] ) < f[j_2] + (sum_C[i] - sum_C[j_2]) * (s + sum_T[i]) <
f [ j 1 ] + ( s u m C [ i ] s u m C [ j 1 ] ) ( s + s u m T [ i ] ) f[j_1] + (sum_C[i] - sum_C[j_1]) * (s + sum_T[i])
簡單的開啟並整理過後就得到了
( f [ j 2 ] f [ j 1 ] ) s ( s u m C [ j 2 ] s u m C [ j 1 ] ) (f[j_2]-f[j_1]) - s * (sum_C[j_2] - sum_C[j_1])

相關推薦

任務安排SDOI2012斜率優化

題目描述 N N N個任務排成一個序列在一臺機器上等待完成(順序不得改變),這

動態規劃專題——斜率優化DP

前言 斜率優化\(DP\)是難倒我很久的一個演算法,我花了很長時間都難以理解。後來,經過無數次的研究加以對一些例題的理解,總算啃下了這根硬骨頭。 基本式子 斜率優化\(DP\)的式子略有些複雜,大致可以表示成這樣: \[f_i=min_{j=1}^{i-1}(A(j)-B(j)*S(i)+C(i)

UVA 11729 任務安排 貪心

題意:給出n個部下交待任務所需要的時間和完成任務所需要的時間,求出完成所有任務所需要的總時間數 #include<iostream> #include<cstdio> #in

【區塊鏈】以太坊Ethereum 高級實戰視頻教程

price 實用方法 def 實戰 draw data java代碼 pri per 【區塊鏈】以太坊(Ethereum )高級進階實戰視頻教程視頻教程地址:http://edu.51cto.com/course/14785.html 課程大綱: 課程概要介紹使用bootn

初識vue 2.08:vuex

rom 註冊 簡單實例 imp module aps cti 函數 maps 主要講三部分內容: vuex模塊化 vuex命名空間 mutations和actions 模塊化 由於使用單一狀態樹,應用的所有狀態會集中到一個比較大的對象,當應用變得非常復雜時

java分散式系統部署學習ansible-playbook

一、併發執行 ansible預設只會建立5個程序,所以一次任務只能同時控制5臺機器執行.那如果你有大量的機器需要控制,或者你希望減少程序數,那你可以採取非同步執行.ansible的模組可以把task放進後臺,然後輪詢它.這使得在一定程序數下能讓大量需要的機器同時運作起來. 使用asy

Spark學習- Spark Streaming與案例實戰

實戰之updateStateByKey運算元的使用 updateStateByKey操作允許您在使用新資訊不斷更新狀態的同時維護任意狀態。要使用它,您需要執行兩個步驟。 1、定義狀態——狀態可以是任意資料型別。 2、定義狀態更新函式——用函式指定如何使用以前的狀態和輸入流中的新值更新

Oracle基礎pl/sql(分頁過程)

   編寫分頁過程         通過pl/sql實現分頁過程,再該過程中由簡單到難一步步深入,目的在於通過該案例熟悉pl/sql的各種儲存過程,包,遊標,如何在java中呼叫等內容的學習。    1、無返回值的儲存過程      例如 1、可以向book表新增書,  

SparkSpark程式設計

目錄: 6、Spark程式設計進階 6.1、累加器 6.2、廣播變數 6.3、基於分割槽進行操作 6.4、與外部程式間的管道 6.5、數值RDD的操作 6、Spark程式設計進階 6.1、累加器 通常在向Spark傳遞函式時,比如使用map()函式或者用fil

Python筆記day28物件|面向物件、hashlib

1,內容回顧 # 作業 ——> 反射 # str 和 repr # 類 object # repr str # str --> 類 str repr 父類object str repr # str --> 類 str 父類str 類rep

小白學 Python 爬蟲18:Requests 操作

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Pyth

小白學 Python 爬蟲20:Xpath

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Pyth

BZOJ2726:任務安排DP+斜率優化+二分

printf 序列 -c int ret 復雜 不能 clu 整數 機器上有N個需要處理的任務,它們構成了一個序列。這些任務被標號為1到N,因此序列的排列為1,2,3...N。這N個任務被分成若幹批,每批包含相鄰的若幹任務。從時刻0開始,這些任務被分批加工,第i個任務單

2016年ACM/ICPC瀋陽賽區 I題樹形dp+斜率優化

題目連結:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5642 題意:給你n個點,n-1條邊的樹。

MySQLMySQL優化思路

優化思路 (1)看錶的資料型別是否設定合理,有沒有遵循選取資料型別越簡單越小的原則 (2)表中的碎片是否整理 (3)表的統計資訊是否收集,只有統計資訊準確,執行計劃才可以幫助我們優化SQL (4)檢視執行計劃,檢查索引使用情況,沒有使用索引,考慮建立 (5)建立索引之

【CodeForces1019E】Raining season邊分治+斜率優化

題目大意 有n個結點的一棵樹,每條邊有兩個權值a,b,第t天經過第i條邊花費時間ait+bait+b,給定m,求t=0,1,2...m−1t=0,1,2...m−1時,最長的路徑長度。 題解 簡介邊分治 類似點分治選擇重心,邊分治選擇一條邊,把樹

BZOJ3963 WF2011MachineWorks動態規劃+斜率優化+cdq分治

end read for div -- pan pac 優化 etc   按賣出時間排序後,設f[i]為買下第i臺機器後的當前最大收益,則顯然有f[i]=max{f[j]+gj*(di-dj-1)+rj-pi},且若此值<0,應設為-inf以表示無法購買第i臺機器。

bzoj [NOI2007]貨幣兌換Cash cdq分治+斜率優化

#include<cstdio> #include<cmath> #include<queue> #include<stack> #include<string> #include<cstring> #include<iostrea

bzoj 1010 [HNOI2008]玩具裝箱toyDP的斜率優化

P 教授要去看奧運,但是他舍不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維 容器中。P教授有編號為1...N的N件玩具,第i件玩具經過壓縮後變成一維長度為Ci.為了方便整理,P教授要求在一個一維容器中的玩具編號是連續的。 同時如果一個

Nodejs基礎5-6HTTP概念

code 數據 才會 cti 異步io 接口 tint 磁盤 資源 1、什麽是回調? 是異步編程最基本的方法,對於nodejs來說需要按順序執行異步邏輯的時候一般采用後續傳遞的方式,也就是將後續邏輯封裝在回調函數中作為起始函數的參數逐層去嵌套。通過這種方式來讓程序按照我們期