4143:与えられた数の
- 合計時間制限:
- 1000ミリ秒
- メモリの制限:
- 65536kB
- 説明
-
これは、与えられた数の数字の組と等しいがあるかどうかを尋ねる、整数の数を示します。
- エントリー
-
合計3行:
最初の行は、Nの整数である(0 <N <= 100,000 )、 nは整数を表すがあります。
2行目は、N個の整数です。これは、0と10 ^ 8の範囲の整数です。
第三のラインは、整数m(0 <= M <=である 2 ^ 30)、 及び必要性を表明しました。 - 輸出
- 現在、mは出力二つの整数、小さな正面の数であれば、大後、単一のスペースで区切られました。複数の条件の数が満たされている場合、より小さな選択の少ない数の数。いいえ、出力ラインの対数の要件を満たしていない場合
- サンプル入力
-
4 2 5 1 4 6
- サンプル出力
-
1 5
書式#include <iostreamの> の#include <アルゴリズム> 使用して 名前空間はstdを、 INT [ 100006 ]。 INTの出力[ 100006 ]。 / * 方法1:二分查找 * / BOOL FUNC(INT A []、int型の和、int型のサイズ、INTの出力[]) { int型のM、I。 int型は右、中、左; 用(i = 0 ; iは、サイズ< - 2 ; iは++ ) { M =和- [I]。 左 =私は+1 ; 右 =サイズ- 1 。 一方(左<= 右) { ミッド = +左(右-左)/ 2 。 もし([中間] == M) { 出力[ 0 ] = [I]。 出力[ 1 ] = M。 返す 真; } そう であれば([中間]> M) { 右 =ミッド- 1 。 } 他 { 左 = MID + 1 ; } } } / * 逆数2バイナリ検索せずに、直接貯蓄計算のように見える追加 * / IF - ((サイズ2 + A [サイズ- ] 。1 ] )== SUM) { 出力[ 0 ] = [サイズ- 2 ]、 [出力。1 ] [サイズ= - 1 ]; 戻り trueに; } 戻り falseにする; } / * 見つける時間、2つの変数iをjは、iが初期値0であり、jは、初期値n-1であります [I] + [Jを見ます ] 、M以上であれば、聞かせJマイナス1、M未満であれば、iは1 LETだけインクリメントされ、 まで[I] + [J ] = M * / BOOL関数func2(INT []、int型の和、int型のサイズ、INTの出力[]) { int型 I = 0、J =サイズ- 1 ; 一方(iは< j)を { 場合(([I] + [J])== 合計) { 出力[ 0 ] = [I]を、 出力[ 1 ] = [j]を。 返す 真; } そう であれば(([I] + [J])> 合計) { J - ; } 他 { 私は ++ ; } } 戻り falseに; } int型のmain() { int型のサイズ、SUM; CIN >> サイズ; のための(INT = I 0、Iは、サイズ<; Iは++ ) { CIN >> A [I]; } CIN >> SUM、 ソート(A、A +サイズ); // 昇順に入力されたデータ //BOOLのRES =のFUNC(和、サイズ、出力)。 BOOLRES = 関数func2(和、サイズ、出力)。 もし(RES == 真) COUT <<出力[ 0 ] << " " <<出力[ 1 ] << ENDL。 他の 裁判所未満 << 「ノー」。 リターン 0 ; }