バイナリ列挙
バイナリ列挙列挙方法は、このような検索の全てに、時には大きすぎるのコレクションとして良い使用であるが、唯一だけで何かまたは他を必要とし、彼らが扱うことができ、検索が半々することができます。
練習
書式#include <iostreamの>
の#include <cstdioを>
する#include <アルゴリズム>
使用して 名前空間はstdを、
const int型 MAXN = 4005 ;
INT [MAXN]、[MAXN] B、[MAXN】C、D [MAXN]、SUM1 [MAXN * MAXN]、SUM2 [MAXN * MAXN]。
INT のmain()
{
int型 I、J、N、CNT1 = 0、CNT2 = 0、ANS = 0 。
scanf関数(" %のD "、&N)
用(i = 1 ; iが<= N; iは++)のscanf(" %D%D%D%D "、および[I]、&B [i]は、&C [i]は、&D [I])。
にとって(i = 1 ; iが<= N; iは++ )
のために(J = 1 ; J <= N; J ++ )
SUM1 [CNT1 ++] = [I] + B [J]。
用(i = 1 ; iが<= N; iは++ )
のために(J = 1 ; J <= N; J ++ )
SUM2 [CNT2 ++] = Cを[I] + D [J]。
ソート(SUM2、SUM2 + CNT2)。
用(i = 0 ; I <CNT1 iが++ )
ANS sum2-(LOWER_BOUND(SUM2、SUM2 + CNT2、-sum1 [I]) - - + = UPPER_BOUND(SUM2、SUM2 + CNT2、-sum1 [i])とSUM2) ;
printf(" %d個の\ n " 、ANS)。
システム(「一時停止」)。
リターン 0 ;
}