各ランプの列挙し、そのランプの最低価格を見つけます
貪欲戦略:チューブの端部は、ランプを配置することができる最も近いノードを見つけるために、再度、ノードに配置されていない場合、ランプは、ランプがどこに配置される、ゼロから右に配置されています
したがって、各ランプを前処理する最初のノードのランプに対応するノードを配置することができる最も近くに配置することができない、即ち、添字自動的に転送を見つけることができるようにします
使用して 名前空間はstdを、 INT [MAXN]。 INT [MAXN] B。 INTのN、M、K。 LL作業(INT INS) { LL ANS = 0 。 INTの ID = 0 。 一方、(ID <= N) { 場合(ID +イン> = N) { ANS ++ 。 破ります; } ID = [ID + イン]。 ANS ++ ; } 戻り ANS * B [イン]を、 } INT メイン() { ながら(〜のscanf(" %D%D%D "、&N、&M&K)) { LAN(0 )。 LAN(B、0 ); (Iについて1 、M) { int型のTEM。 scanf関数(" %のD "、およびTEM)。 [TEM] = 1 。 } (Iについて1 、K) { int型のTEM。 scanf関数(" %のD "、& B [I])。 } もし([ 0 ] == 1 ) { のprintf(" -1の\ n " ); 続け; } int型の ID = 0 。 int型 curLenで指定= 0 ; int型 MAXLEN = 0 ; (Iについて1 、N) { 場合([I] == 0 ) { [I] = I。 ID = I; } 他 { [I] = ID。 } MAXLEN = MAX(I-、maxlenを[I])。 } であれば(maxlenを> = K) { のprintf(" -1の\ n " ); 続け; } LL ANS = 1LL << 60 。 (I、maxlenを用 + 1 、K) { ANS = 分(ANS、ワーク(I))。 } のprintf(" %LLDする\ n " 、ANS)。 } リターン 0 ; }