問題の報告書へのCH301タスクスケジューリングソリューション2

トピックポータル

[タイトル]効果

問題の意味ミッションスケジュール1、データ範囲は$ 1 \ルNの\のLE3となり* 10 ^ 5,1 \ルS、T_I、C_I \ le512 $

[解析]アイデア

私たちは、マイナーな最適化ソリューションに1つのタスクを手配します

(ST [I] + S)* SC [J] \ - セット$ ST、SC $はT $であり、接頭辞Cの$配列と伝達方程式は[J] F [I] =分\ {F $に変換されます。 }(0 \ルJ <I)+ ST [i]は* SC [I] + S * SC [n]は$

我々は、分$ $関数を削除し、その後、約J $ $ F変数とみなす[J]、皮下[J] $、残りの部分が考慮される$定数は、$ F [J] =(ST [I] + S値)* SC [J] + F [i]の-st [I] * SC [i]は-S * SC [n]は$

我々縦軸に対して確立さ$ SC [J] $横軸、$ F [j]が$平面の直交座標系、これは$ STの傾きである[I] + Sの$、$ yをする$軸カットで[I] -st [I] * SC [I] -S * SC [n]は$ストレートF $の距離。同等の、座標系候補セットは、点の集合であり、各決定の$ $のJは、システムが点$(SC [J]、F [J])$に対応する座標。ラインの傾きは[i]が小さい$ F次に$、小さい切片を固定されています。

速やか無駄決定を除去するために、我々は、「隣接するスロープを結ぶ2つの線分が単調増加」と維持「凸包の下に。」直線の$ kは$勾配のために、線の傾きは、ときに左頂点$ <k個の$、右セグメント$の傾き> K $は、次いで、頂点は最適な決定です。

具体的には、キュー単調凸包を維持するためにこれを使用することができます。$ Q $は単調頂点の凸包に対応する決定変数の複数のキューを保持し、横軸インクリメントさを満たす、隣接2点を結ぶ線分の傾きも単調に増加しています。

次のように各状態変数$ i個の$のために、私たちは進みます。

{ - F [Q [L] F [Q [L + 1]]}、{$ Qを[L]、Q [L + 1] $、もし$ \ FRACの傾きの2つの決定変数$ 1 $ HOL検査SC [Q [L + 1]] - SC [Q [L]]} \ルS + ST [i]は$、プットの$ Q [L] $ヘッド素子まで繰り返し操作まで満たさないデキュー

この場合、$ $ HOL $ Q [L] $最適な決定であり、計算$ F [i]が$ 2.

3.テール$ $要素の$ Q [R-1]、Qをチェックする[R] $ $ I $を満たす単調増加勾配、満たさない次いで$ Q [R] $デキュー尾要素まで繰り返します単調に増加するスロープを満たして、私は$ $は、尾に挿入します

アルゴリズムの時間計算量は$ O(N)$です

[]コードの実装

1の#include <cstdioを>
 2の#include <iostreamの>
 3の#include <CStringの>
 4の#include <アルゴリズム>
 5の#include <cmath>
 6の#include <キュー>
 7  の#define G()GETCHAR()
 8  の#define RGレジスタ
 9  の#defineは <;(= BをI ++は(I、B)iがRG iは= INT)に行く
 10  の#defineバック(I、B)(RG iは= int型のために、I = B>。 i--)
 11  の#defineダブルDB
 12  の#defineは長い長いっ
 13  の#define ILインライン
 14  の#define PFのprintf
 15  の#defineMEM(A、B)のmemset(A、B、はsizeof(A))
 16  使用 名前空間STDを、
17  int型のFR(){
 18      INT W = 0、Q = 1 19      CHAR CH = G();
20      一方(CH < ' 0 ' || CH> ' 9 ' ){
 21          であれば(CH == ' - ')、Q = - 1 22          CH = G();
23      }
 24      ながら、(CH> = ' 0 ' && CH <=' 9 ')w <<(= W 1)+(W << 3)+ CH- ' 0 '、CH = G();
25      リターン * wのQ;
26  }
 27  のconst  int型 N = 3E5 + 2 28  INTの N、S、Q [N]、L = 1、R = 1 29 LLのF [N]、ST [N]、皮下[N]、など30  INT メイン(){
 31      // freopenは( ""、 "R"、STDIN)。
32      // freopenは( ""、 "" W、STDOUT)。
33      N = frの(); S =のFR()。
     行く(I、1、N)ST [I] = ST [I- 1 ] + FR()、SC [i]は= SC [I- 1 ] + FR()。
35      MEM(F、0x3fを); [F 0 ] = 0 36      Q [ 1 ] = 0よう =秒* SC [n]は、
37      ゴー(I、1 、N){
 38          RG LL kは= S + ST [i]は、
39          一方(L <R && F [Q [L + 1 ]] - F [Q [L] <= K *(SC [Q [L + 1 ]] - SC [Q [L]))L ++ 40          F [i]は= F [Q [L]] - K・SC [Q [L] + ST [I] * SC [I] + として;
41         一方(L <R &&(F [Q [R] - F [Q [R- 1 ]])*(SC [I] -sc [Q [R]])> =(F [I] -f [Q [R]])*(SC [Q [R] - SC [Q [R- 1 ]))r--の42          Q [++ R] = I。
43      }
 44      PF(" %LLDする\ n " 、F [N])。
45      リターン 0 ;
46 }
コードはここで突きます

おすすめ

転載: www.cnblogs.com/THWZF/p/11716740.html