羅区P5017:カーフェリー - 問題への解決策

https://www.luogu.org/problem/P5017

参考:https://www.luogu.org/blog/ztyluogucpp/solution-p5017

私は、私はおそらくそれをスクラップと思います。

確かに$ tの$の並べ替えする必要があります。

オリジナルのアイデアは確かに[i]は$前に$私は完全に個人的な車を$や到着の最小待ち時間に表すF $です。

あなたは$ F $は単純に転送することはできません、シャトルに時間を与えていない場合しかし、あなたは見つけることができます。

そして、$最後のバス$ jは$最小の時間を待っているとき、[I] [J] $うち表明F?

データ範囲は、顔を打つ、私は、問題の解決策を確認するために行ってきました

最後のバスアウトすることをしかし、我々は$ [T [i]は、$ tと[i]が+メートル)、バスがで-1 $ $トンうち最悪になるように[i]の中で、実際にいくつかの時間を発見しました、$ tの[i]が+ M-1 $バック我々は車が駐車してみましょう、その後、明らかに白の乗客を出す場合。

最小の時間を待っているときだから我々は、$ F [i]は、私が個人的な車を$や全体ステーション上の最初の$のための[J] $、$ tから最後のバス[i]が+ jは$アウトを変更することができます。

状態遷移方程式を簡単に書くことができます。

$ F [I] [J] =分([I] [j]をfは、[K] [L] + SUM(K + 1、I、T [i]が+ j)はF)$(もし変数正当性を確保する必要が)

最終的な答えは、$([N] [0] \ SIM F [n]は[M-1] F)$分であります

$和(i、j、k)は、$ $ I $関数は、(1)$忘れ明らかにJ $ $ $ kは$開始時間のような人々とを、待つ、と事前に接頭辞の$ Oすることができ、人の時間を表し、 。

しかし、この式は$ O(N ^ 2メートル^ 2)$はどのように行うにはいなかったのですか?

$ jの$の下限我々は確かに$ MAX(T [K] + L + MT [i]が、0)$が、実際には$ $ M-1にあなたをこの列挙を制限する必要がありますか?

もちろん、車の待機させより車で$ I $、あなたは時期尚早早期発症ことができますように、下限の$ F $ -up状態が間違っているかもしれませんが、答えは真でなければならないもののので。

複雑さの$ O(N ^ 2メートル)$ $ jの$を、列挙する必要はありません

#include <cmath> 
の#include <cstdioを> 
する#include <CStringの> 
する#include <iostreamの> 
する#include <アルゴリズム>
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型 N = 505 ;
CONSTの INT M = 105 constの LL INF = 1E18; 
インラインint型リード(){
     int型 X = 0、W = 0CHAR CH = 0 しばらく(!isdigit(CH)){W | = CH == " -' ; CH = GETCHAR();}
     ながら(isdigit(CH))X =(X << 3)+(X << 1)+(CH ^ 48)、CH = GETCHAR()。
    リターン?W - X:X; 
} 
LL T [N]、S [N]、[N] [M] F。
LL和(INTの L、int型のrは、今LL){
     戻り今*(R-L + 1)-s [R] + S [1- 1 ]。
} 
int型のmain(){
     int型 N =(読み取り)、M = read()は、
    以下のためにint型私= 1 ; iが<= N; I ++)はT [I] = 読み取ります(); 
    ソート(T + 1、T + N + 1 )。
    以下のためにint型 i = 1 ; iが<= N; iは++)S [I] = sの[I- 1 ] + T [i]は、
    以下のためにint型私= 1 ; iが<= N; iが++ ){
         ためINT J = 0 ; J <Mであり、j ++)[I] [J] F = SUM(1、I、T [i]が+ j)と、
        INTの J = 1、J <I、J ++ ){
             ためのint型のk = 0 ; K <M; ++ k個){ 
                っ今 = MAX(T [J] + K + M、T [I])。
                F [i]は[今-t [I] =分(F [i]が[今-T [I]、[J] [K] +和F(J + 1 、I、今))。
            } 
        } 
    } 
    LL ANS = INF。
    以下のためにint型 i = 0 ; iがm <; iは++)ANS = 分(ANS、F [n]は[I])。
    printf(" %LLDする\ n " 、ANS)。
    リターン 0 ; 
}

+++++++++++++++++++++++++++++++++++++++++++

 +著者:luyouqi233。+

 +私のブログへようこそ:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

おすすめ

転載: www.cnblogs.com/luyouqi233/p/11365405.html