4つの値を持つ合計は0である(バイナリソート+)

フェイス質問

次のように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 
}

より転載https://www.cnblogs.com/lisijie/p/7289457.html

おすすめ

転載: www.cnblogs.com/xxxsans/p/12641545.html