質問の意味:
与えられたnはその後、kの左右のkにロードされたルータがネットワーク上にインストールしてインストールすることができる場合、私はいくつかの部屋を費やしたとして、ネットワークに接続されたネットワーク、i番目の部屋に接続された各部屋を与える余地はルータにインストールすることができます。ルータiに対するコスト
すべての客室には、ネットワークを装着したように、Qは、最小値をとります
DP単調スタック:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define担当者(I、B)(I =(A)がINT;方には<=(B); iが++) の#define repp(I、B)(I =(A)がINTのために、I> = (B); - I) の#defineは長い長いっ の#defineは(X)(CERR <<(#X)<< '=' <<(X)<< ENDL)を参照 の#define INF 0x3f3f3f3f の#define CLR( 、V)のmemset(A、V、はsizeof A) ///////////////////////////////// / CONST INT N = 2E6 + 10 。 INTのN、M、L、R、ST [N]、K。 チャーS [N]。 LL DP [N]。 INT メイン() { scanf関数(" %D%dの"、&N&K)。 scanf関数(" %sの"、S + 1 )。 L = R = 1 ; STは、[ 1 ] = 0 。 担当者(I、1、N + K) { DP [I] = DP [I- 1 ] + I。 もし(I> K && S [IK] == ' 1 ' ) { DP [I] =分(DP [I]、DP [ST [L] + IK )。 } であれば(ST [L] <I- 2 * K)L ++ 。 一方、(L <= R && DP [ST [R]]> = DP [I])r--の; ST [ ++ R] = I。 } LL ANS = 1E18。 担当者(I、N、N + K)ANS = 分(ANS、DP [I])。 coutの << ANS; リターン 0 ; }
ゲームは最短の練習のとき
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 // BXDによる入力 の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT) の#defineためreppを(I、B)(I =(A int型); I> =(B); - I) の#define RI(N)のscanf( "%d個"、&(N)) の#define RII(N、M)のscanf( "%D%dの"、およびN、 &M) の#define RIII(N、M、K)のscanf( "%D%D%D"、&N、&M&K) の#define RS(S)のscanf( "%sの"、S); #defineは長い長いっ の#define INF 0x3f3f3f3f の#define REP(I、N)のための(; iが(N)<I ++は、I = 0をINT) の#define CLR(A、V)のmemset(A、V、 N = 1E6。 const int型 M = 1E6; int型のヘッド[M]; int型のPOS。 構造体のエッジ { LLのV。int型、NEXに。 }エッジ[M]。 ボイド(ADD INT、int型B、LLのC) { エッジ[ ++ POS] = エッジ{C、B、ヘッド[A]}。 ヘッド[A] = POS。 } 構造体ノード { LL dを、int型のID。 ブール 演算子 <(constのノード&B)のconst { 戻り D>BD; } }。 LL DIS [N]。 int型VIS [N]; INTのN、M、K、A、B、C、T。 チャーS [N]。 ボイドダイクストラ(int型の) { 担当者(I、0、N + 1)DIS [I] = 1E18。 DIS [S] = 0 ; PRIORITY_QUEUE <ノード> Q; q.push(ノード{ 0 、S})。 一方、(!q.empty()) { ノードU = q.top(); q.pop()。 もし(VIS [u.id])続けます。 VIS [u.id]= 1 ; 以下のために(int型 ; I I = I =ヘッド[u.id】エッジ[I] .nex) { int型 V = エッジ[I] .TO。 もし(u.d +エッジ[I] .V < DIS [V]) { DIS [V] = u.d + エッジ[I] .V。 q.push(ノード{DIS [V]、V})。 } } } } int型のmain() { scanf関数(" %D%dの"、&N&K)。 scanf関数(" %sの"、S + 1 )。 担当者(I、1、N) { 追加(I、I + 1、1LLの*のI)。 追加(I、I - 1、1LL * 0 ); もし(S [I] == ' 1 ' ) を追加(MAX(1、IK)、分(N + 1、I + K + 1)、1LL * I)。 } (N追加 + 1 * 1LL、N、0 ); ダイクストラ(1 )。 COUT << DIS [N + 1 ]。 リターン 0 ; }