フェイス質問
次のようにSUMの問題を定式化することができる。多くの四重で(A、B、C、D)∈A、X B、X C、X Dは、+ bはそのようなあるかの整数値、計算の4つのリストA、B、C、D与え+ C + D = 0。以下では、我々はすべてのリストは、同じサイズnを持っていることを前提としています。
入力
入力ファイルの最初の行は、nリストのサイズが含まれ(この値は、4000と同じ大きさであることができます)。我々は、次に持ってN(2として大きな絶対値を有する4つの整数値を含む行
28
A、B、C及びDのそれぞれに属します)。
出力
各入力ファイルの場合は、あなたのプログラムは、その合計がゼロである数の四つ組を記述する必要があります。
サンプル入力
6 -45 22 42 -16 -41 -27 56 30 -36 53 -37 77 -36 30 -75 -46 26 -38 -10 62 -32 -54 -6 45
サンプル出力
5
ヒント
サンプル説明:実際には、5次の四つ組の和はゼロである:(-45、-27、42、30)、(26、30、-10、-46)、(-32、22、56、-46) 、( - 32、30、-75、77)、(-32、-54、56、30)。
質問の意味:
N * 4の行列に、入力数N * 4は、各列の番号を検索し、そして4番は0ようなものであること。
分析:
最初の二つ得られ、B、C及びDの数のいずれか2つ、そして各アレイ、CDおよびソート後格納され、その後、二分法を見つけるために、バイナリ検索をする場合は、中間データであれば状況は、複数のデジタル同等のものを除外することはできないので、両側に下るために何かを見つけることが資格
注意:
結果によれば、第2のデータセットを求める際に合計に提出初期化する必要はありません。
ソリューション:
#include <iostreamの> する#include <CStringの> する#include <cstdioを> する#include <アルゴリズム> 使用して 名前空間をSTD。 const int型 N = 4005 ; int型; [N]、B [N]、C [N]、D [N]を int型 AB [N * N]、CD [N * N]; INT のmain() { int型 N、合計= 0 、I、J。 一方、(CIN >> N) { ための(iは= 0、I <N; I ++ ) CIN >> [I] >> B [i]は>> C [I] >> D [i]は、 int型 NUM1 = 0、NUM2 =0 ; 以下のための(iは= 0を I ++; I <N ) のための(j = 0 ; J <N J ++ ) { AB [NUM1 ++] = [I] + B [J]。 CD [NUM2 ++] = - (C [I] + D [J])。 } ソート(CD、CD + NUM2)。 以下のための(iは= 0 ; I <NUM1 I ++ ) { int型の中間、最大= num2- 1、低= 0 。 一方、(低いが<= 最大) { ミッド=低+(アップロー)/ 2 。 もし(AB [I] == CD [中間]) { 合計 ++ 。 ため(J =ミッド+ 1、J <最大=、J ++ ) { 場合(AB [I] == CD [J]) 合計 ++ 。 他に 休憩; } ため(J =半ば1 ; J> =低; j-- ) { 場合(AB [I] == CD [J]) 合計 ++; 他に 休憩; } ブレーク; } 他 { 場合(AB [i]が> CD [中間]) 低 =ミッド+ 1 。 他の アップ =半ば1 。 } } } COUT <<総<< ENDL。 } 戻り 0 。 }