合同式最短部分インク式に機械P3403 / P2371インクジャンプ[最短]合同
【P2662】牛フェンス
トピックの背景
小さな泥孟を支援することにより、Lは、成功したバイナリツリーを改正の問題を解決するため、紙を書きました、
首尾よくフォーク研究所に提出(羨ましいありません?)。ディケンズのハードワークと私の卒業時に彼の成功のスイッチシステムは、経営の光華学校、北京大学に入学しました!卒業後、彼らの蓄積で経済学とコンピュータサイエンスの強力な基盤、現代の酪農場の構築の成功と!
タイトル説明
牛は、彼はフェンスの建設にLの知恵と小さな牛の農場を意図した、非常にスマートです!構築することができます木製のフェンスの小さなLのN種類がありますが、長さはL1、L2···LN、無限の長さの各木材です。
構築されたとき、彼が選択したすべての木材は一緒にスプライスなり、フェンスの長さは、木材や長さの彼の使用です。しかし、スマート小さな長さLはすぐに多くは木材の長さを加えた、後で再利用木材の一部をカットする際に必要なことを決めていないことがわかりました。
しかし、比較的小さなLの節約のため、彼は自分自身を設定:任意の木材のみのMメートルまで短くカットすることができます。もちろん、木材掻き取り木のそれぞれは、すべて同じ長さを必要としません。7および11であった彼は木の2つの長さを有しているので、もし測定ツールは、木材のみ正確スラッシングメーターすぎるプリミティブ、小さな整数Lであるためしかし、それぞれは、次いで実質的に、1メートルだけカットすることができ4つのを使用することができる木材の長さは、6、7、10、11であるが存在します。
そのため、小さなLの世界でもユニークな私の牛を信じているので、彼らは自分のフェンスを設計してみましょう。牛は関係なく、木材のL少し希望はどのようなプロセス、長さやフェンスの全長を通じて自分たちのデザインを取得することはできません、仲間を望んでいないとゲームフェンスに限定されているので、小さなLで物事を困難にしたいです。しかし、小さなLは、フェンスの長さが小さすぎると、小さなLはすぐにそれを構築するのはよくないことがわかります、知っています。だから、彼女はフェンスの最大長は構築できない見つけるためにあなたの助けを望んでいます。
これは賢いあなたを打つ必要があります!あなたは小さなLのこの問題を解決するのに役立つことができれば、多分彼はあなたにああの資産の最後の1/8をあげます!
入出力フォーマット
入力フォーマット:
入力の最初の行は、2つの整数N、Mを含有する、それぞれ、掻き取ら木材及び木材の種類ごとの最大値を表します。次の行の各整数のLi(1 <LI <3000)は、i番目の木材の元の長さを表します。
出力フォーマット:
出力のみの1つのラインフェンスの最大長さを示す整数を構築することができない含ま。フェンスの長さは、任意の構造または存在しない最大値、-1の出力とすることができる場合。
サンプル入力と出力
2 1 7 11
15
説明
40%:1 <N <10、0 <M <300
100%:1 <N <100、0 <M <3000
考え
すでに書かれた最短合同についての何かが、ここでは、この質問に直接関係します。
まだいくつかの数字によってマルチパスによる条件Mに、一緒にこの質問を残りの行数をこすりするために、我々は数字を探し出すことができ、すべての暴力を入れて、それが最小の黒字は、xの省提供することできるようにする必要があります。
次いで、すべての番号を介して実行に使用され、残りの行は、X側を構築し、そして最終的に最短パスを実行することができます。
Couchuの最大数は時間を見つけることができない、我々は最初の重要dの配列を考慮する必要があります。D [i]がある他の図は、最小数の%X = Iを掻き取ることができ、その後、D [i]が+ X、D [i]は+ 2X、D [i]が+ 3X ... D [i]はジャンプより達成するために、すべてのxの。
次いで、X = Iデジタル%、及び最大スクレープうちD [i]は-xです。
それは明らかであり、最大値をとる全てのD [i]は-x探し出し、。
しかし、注意すべき場所があり、この質問は、出力を必要としている-1。-1を出力する場合は、ハッシュアウトの数ではないであり、我々は、1の存在限り、木材を使用することができ、すべての自然長を達成することができます。
別のケースでは、最大値が存在しないということです。Aは、それが1に等しくない場合、自然数のシリーズが掻き出すない、すべての数値のGCDを得ているの2点の方向があります。我々はGCDの倍数でなければなりません。この数の掻き出すことができますので、空席を掻き出す必要がありますが、時間ではありません。別の方法は、(maxは最短の前に配置された最大ランd配列である)最後の時間を見つけるANS D [i]が> maxのかどうかを確認する方法を有することであり、もしそうであれば、%X = Iの文字列が存在しなければなりません港区数字は出ていません。(実際には、この方法は、データの使用を推測するために、比較的小さなほぼ同等です)
コード:
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <キュー> の#include <アルゴリズム> 使用して 名前空間はstd; INTのN、M。 INT X、[ 101 ]。 INT [版5100001 ]、次に[ 5100001 ]、ヘッド[ 2600001 ]、エッジ[ 5100001 ]、TOT、D [ 2600001 ]、VIS [ 2600001 ]、ANS = 0 。 キュー < 整数 > Q; 無効アドオン(int型のx、int型の Y、int型Z){ 版[ ++ TOT = Y。 次【TOT] = 頭部[X]。 エッジ【TOT] = Z; ヘッド[X] = TOT。 } int型のmain() { scanf関数(" %D%dの"、&N、&M)。 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %dを"&[I])。 } ソート(A + 1、A + N + 1 )。 X = MAX(1、[ 1] - M)。 もし(x == 1 ){ のprintf(" -1 " )。 リターン 0 ; } のための(int型 i = 1 ; iが<= N; iが++ ){ ため(INT [1-(J =最大1 ] + 1、[I] -m); J <= A [i]は、J ++ ) { 場合(J =!X){ ため(int型のk = 0 ; K <X、kは++ ){ (K、(K追加%+ j)を、X j)を。 } } } } のmemset(D、0x3fを、はsizeof (d)参照)。 D [ 0 ] = 0 ; q.push(0 )。 しばらく(!q.empty()){ int型のu = q.front(); q.pop(); VIS [U] = 0 ; 以下のために(int型 I =ヘッド[U]; I; I = 次に[I]){ int型 V =版[i]は、Z = エッジ[I]; もし(D [V]> D [U] + Z){ D [V] = D [U] + Z。 もし(!VIS [V]){ VIS [V] = 1 。 q.push(V); } } } } D [X] = 0 。 以下のために(int型 i = 1 ; iが<X、iが++ ){ // のprintf( "%D%D \ n"は、I、D [I])。 もし(D [i]が> 100000000 ){ のprintf(" -1 " )。 リターン 0 ; } ANS = MAX(ANS、D [i]は- X)。 } のprintf("%のD" 、ANS); 戻り 0 ; }
上記。