トピックへのリンク:https://nanti.jisuanke.com/t/41393
タイトル効果:分析n個の点に加え、このような対称の中心点すなわち点Qの最小数。
ソリューション:
2点は、中心点を決定することができる、中心点のO(N ^ 2)列挙中心点、提供CNT [Xcの] [Ycを(Xcの、Ycのは)個であります
回数については、
次に中心点(Xcの、Ycの)、N-2 * CNT [Xcの] [Ycの】補うために必要なポイント数 - 元に(点(Xcの、Ycの)を
セット内の点の数)が表示されます、
あなたは、マップやハッシュ値cnt記録することができます。
入力座標が2で乗算された場合に加えて、すべての整数上の中心点の座標を列挙します。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 構造体ST { LLのX、Y。 } STM [ 1005 ]。 マップ <LL、int型 > 融点; マップ <LL、int型 > MP1。 セット <LL> SE。 constの LLのTEM = 1E7; キュー <LL> QUE。 マップ <LL、int型 > VIS; INT のmain(){ int型のn; scanf関数(" %d個"、&N); int型 MAXS = 0 ; 以下のために(int型 i = 0 ; iがn <I ++は{) のscanf(" %のLLDの%のLLD "、およびSTM [I] .X、およびSTMを[I] .Y)。 STM [I] .X * = 2 ; STM [I]・Y * = 2 ; LL TT = STM [I]・X * TEM + STM [I] .Y。 MP [TT] ++ ; } のために(int型 I = 0 ; iがN <; Iは++ ){ ため(INT J = 0 ; J <N; J ++){ 場合(iは< j)を{ LL TT =(STM [I]・X + STM [J] .X)/ 2 * TEM +(STM [I] .Y + STM [J]・Y)/ 2 。 int型のカウント= ++ MP1 [TT]。 もし(>カウント{MAXS)を MAXS = 数えます。 しばらく(!que.empty())que.pop(); que.push(TT)。 } そう であれば(==カウントMAXS)を{ que.push(TT)。 } } } } int型= ANS N-; ながら(!{que.empty()) LL TT = que.front(); que.pop(); ANS =分(ANS、N - MP1 [TT] * 2 - (MP [TT]&1 )); IF(MP [TT]&1。 )BREAK ; // COUT TT << << ENDL; } ため(int型 I = 0 ;私は<N-; Iは++){ // 場合を考える原点に中心点 LL STM = TT [I] .X + * TEM STM [I] .Y; ANS =分(ANS、N - MP1 [TT] * 2 - (MP [TT]&1。)); } printf(" %d個の\ n " 、ANS)。 リターン 0 ; }