タイトル説明
私の名前のハンマーは、薬剤です。テロリスト香港Lianshunを逮捕、バイト単位でビートストリート待ち伏せ:私は使命を受けました。そして私は、私が提案し、他の二つの薬剤がある一緒に行動します
我々はNバイトで選択された1.3待ち伏せサイトでは、ストリートの建物を打ちます。
2.お互いの世話をするために、我々は二つの薬剤間の最も遠い距離がDを超えていないことを決めました
質問を聴いてください:大きい、N(待ち伏せ点として、建物の選択番号)、D(最大遠い二つの薬剤の間の距離)と、この演算で算出任意アーキテクチャ座標を、与えられましたハンマー隊どのように多くの待ち伏せ選択。
注:
1.二つの薬剤は、同じ場所に影響されていない
3つのエージェントが同等である2:すなわち、同じ位置の組み合わせ(A、B、C)のみないので、「エージェントとの位置交換の、方法と考えることが影響します「繰り返しの使用
入力説明:
最初の行は、2つのスペースで区切られた番号N及びD含有する(1≤N≤1000000; 1≤D≤1000000)を
整数各位置、第二の線は、建物のNの位置が含まれている(値区間[0、100万)は昇順(ストリート軸を見1つのバイトジッタ)で表します
出力説明:
影響を受ける異なるスキームの数を示す数字。結果は、オーバーフロー99997867剰余を求めることができます
1 DEFメイン(): 2 LINE0 =リスト(マップ(INT。。、入力()ストリップ()スプリット(' ' ))) 3つの 建物=リスト(マップ(INT。。、入力()ストリップ()スプリット(' ' ))) 4 N、Dは= LINE0 [ 0 ]、LINE0 [ 1 ] 5 もし N < 3 : 6 プリント(0 ) 7 他: 8 DP = [ 0 ] * N 9 もし建物[ 2 ] -建物[ 0 ] <=D: 10 DP [ 2 ] = 1 11 I = 3 12 = J 0 13 ながら、 iは< N: 14 ながら、 J <= I - 2 : 15 であれば建物[I] -建物[J]> D: 16 J + = 1 17 他: 18 休憩 19 DP [I] =(I - J)*(I - J - 1)// 2 20 I + = 1 21の 合計= SUM(DP) 22 プリント(和%99997867 ) 23 24 なら __name__ == ' __main__ ' : 25 (メイン)
アルゴリズムのアイデア:スライディングウィンドウ+ +動的計画の組み合わせ。
このトピックでは、いくつかの困難を持っている、それが話題アルゴリズム思考の包括的な品種です。
まず、被験者は、距離D以上ではない「の組み合わせの数」を算出し、ノード3は、サブインターバル未満である、任意の三点を取り、それらの組み合わせを構成することです。
左から右にこのサブインターバル。移動中に設定することができる組合せの新しい数が算出されます。
DPの初期化は、記録のために:DP [i]は、サブ領域の最大数はこれらの組み合わせであってもよい(必ずしもノードを含むI)の端部です。
iが含まれている必要があり、ノードので、単に前に、このノードの最大可能なサブ領域を考慮して、任意の2つのノードをさらに取ることができます。
たとえば:3に等しい、* 3 2 // 2:3つのノードのように計算任意の2つのノードを取ります
6に等しい4 * 3 // 2:4つのノードは、のように計算任意の2つのノードを取ります
これは、ライン19上の式にまとめることができます。
DP和の右端、一度完全なトラバーサルに右にウィンドウのスワイプは、所望されます。
ウィンドウ戦略をスライディングライン13〜18の行為は、私はjは左マージンで、右の境界です。閉じた間隔内のすべてのノード[jは、I-1]任意の2つのノードを取るたびに計算されます。