タイトル説明
小さな$ S $は折り紙を愛しました。
ある日、彼は彼が均等に単位長に分け、右の$ N $に左の長いテープを、だ、と数字$ 0 \シムnは、それぞれの境界で$でマークされています。
そして、小さな$ S $退屈な折り紙を開始し、毎回彼はテープに沿った位置は、この数字が現在配置されて折り畳まれ、番号を選ぶだろう(それが境界に何もしないと同等のものを持っている場合)。
小さな$ S $ $ M $は、はるかに長い時間が紙テープを折ら方法を知りたい後。
入力形式
最初の行は、2つの正の整数$ N $と$ M $、テープの長さおよび動作の表現の数を含んでいます。
次の行は$ D_I $ $ I $は選択された回数を表した整数$ M $ $ $ D_Iが含まれています。
出力フォーマット
だけで一つのデジタル出力ファイル、テープの最後の長さ。
サンプル
サンプル入力:
5 2
3 5
出力例:
2
データ範囲とヒント
$ $ N \のleqslant 3000のデータ$ 60 \%、Mの\ leqslant 3,000 $。
データ$ $ N \のleqslant {10} ^の$ \ 100% {18}は、M \ 3,000 $をleqslant。
問題の解決策
$ 60 \%の$アルゴリズム:
直接シミュレーションの折り処理は、できるようになりましたすべての更新の暴力を各点の位置を記録します。
初期化を覚えておいてください。
時間の複雑さ:$ \シータ(N \回M)$。
期待はスコア:$ $ 60点。
実際のスコア:$ $ 60ポイント。
$ \ 100%の$アルゴリズム:
私達はちょうど現在の操作の位置を考慮したように、注意して各テープの場所を見つけることができません。
式$ D_j = ABS(D_I-D_j)$のように、すべての操作の重量に対してそれぞれ$ \シータ(M)$リファレンスの後に行わフランジ。
時間の複雑さ:$ \シータ(M ^ 2)$。
期待はスコア:$ $ 100ポイントを。
実際のスコア:$ $ 100ポイント。
コードの時間
#include <ビット/ STDC ++ H>
名前空間STDを使用して、
長い長N、M。
長い長L、R。
長い長いWZC [5000];
INTメイン()
{
scanf関数( "%のLLDの%のLLD"、&N、&M)。
L = 0、R = N。
以下のために(INT I = 1; I <= M; iは++)
{
scanf関数( "%のLLD"、&WZC [I])。
用(INTのJ = 1、J <I、J ++)
IF(WZC [j]> = WZC [i])と
WZC [I] = 2LL * WZC [J] -wzc [I]。
R = MAX(R、2LL * WZC [I] -1)。
L = WZC [I]。
}
のprintf( "%のLLD"、RL)。
0を返します。
}
RP ++