HDU 1,007 이차원 가까운 점 문제 (분할 컨커)

세 영역의 가장 가까운 포인트가 발생할 수 SL, SR, L을 d는 거리 SL의 SR에 가장 가까운 지점 인 양면 (LD ~의 L + d)에 

 

 출처 : https://www.cnblogs.com/AdaByron/archive/2011/10/07/2200966.html

다음 코드를 참조 : https://blog.csdn.net/u011523796/article/details/41593511

1 #INCLUDE <알고리즘>
 2 #INCLUDE <cstdio>
 3 #INCLUDE <cmath>
 4 #INCLUDE <CString을>
 5  이용  스페이스 성병;
6  
7  CONST의  INT의 N = 100005 ;
8  
9 타입 정의의 구조체 TagPoint {
 10      X, Y;
11      INT의 인덱스;
12  } 포인트;
13  
14  포인트 A [N], 2 [N], 3 [N];
15  
16  부울 cmp_x ( CONST 점 A, CONST 점 B) {
 17     반환 AX < BX 단계;
18  }
 19  
20  부울 cmp_y ( CONST 점 A, CONST 점 B) {
 21      반환 AY < 단계;
22  }
 23  
24  DIS (점 (P), 점 (Q)) {
 25       X1은 픽셀 - QX, Y1 = PY - QY;
26      리턴 SQRT (X1에서의 * X1 + Y1의 *의 Y1);
27  }
 28  
29  공극 병합 (B 점 [], C 점 [], INT의 L, INT의 m, INT의 R) {//归并操作
 30      INTI =의 L;
31      INT의 P1 = 1, P2에서의 m = + 1 ;
32      동안 (P1 <P2 && = m <= R) {
 33 개          (B) [I ++]의 C = [P1] .Y <C [P2] .Y? C [P1 ++] C [P2 ++ ];
34      }
 35      동안 (P1 <= m) ㄴ [I ++]의 C = [(P1) ++ ];
36      동안 (P2 <= R)의 B [I ++]의 C = [P2 ++ ];
37 개      를 memcpy (C + L, B + 1, (R-L + 1 ) * 는 sizeof (점));
38  }
 39  
40   (a [], B 점 [], C 점 [], 점 가까운 INT의 L, INT의 r)을 {
 41     만약 (R - 패 == 1 ) 반환 DIS (a [1]을, A [R]);
(42)      만약 (R - L == 2 ) {
 43           X1 = DIS (A [1], A [R]);
44           X2는 DIS (a [L + 1 ], A [R]);
45           X3 = DIS (A [1], A [L + 1 ]);
(46)          만약 (X1 <X2 && X1 <X3) 복귀 X1;
(47)          그 밖의  경우 (X2 <X3) 복귀 X2;
48          다른  반환 X3;
49      }
 50      INT 중간 = (L + R) /2 ;
 51이다      의 INT , J, K I;
 52이다      대해 (L = I, J = L, K + = MID . 1 ; I <= R & LT ++ {I)
 (53)는          IF (B [I]있는 .index <= MID) C [J ++] = B [I]는,
 54이다          다른 C [K ++] = B [I]을,
 (55)      }
 (56)는      더블 D1 = (A, C, B, L, MID) 인근 // 동작 것 "b 값 "C 환원 B 내지 때문에 라인 (60)의 변화;
 (57)는      더블 D2 = 가까운 곳 (A, C, B, MID + . 1 ], R & LT)
 58       DM = 분 (D1, D2),
 59      
(60)      병합 (B, C, L , MID, 및 R LT)
 (61)는      에 대해 (I = L, K가 L =; I는 <= & lt; 화학식 ++ⅰ) {
 62          의 경우 (팹 (b [I] .x와 - B [미드] .x를) < DM) {
 63              (C)의이 = [++ K] B가 [I];
64          }
 65      }
 66       (! I = 1, I = K; ++ I) {
 (67)          에 대한 (j = 1이 + 1 ! J = K && C [J] .Y - C [I] .Y <DM; ++ J) {
 68               온도 = DIS (c [I], C [J]);
(69)              의 경우 (온도 <DM) : DM = 온도;
70          }
 71      }
 72      리턴 DM;
73  }
 74  
75  INT의 주 () {
76      INT N-;
 77      그동안 (는 scanf ( " %의 D " , 및 N-) == . 1 개 && N-) {
 78          위해 ( int로 I = 0 , = N-I ;! ++ I) {
 79              는 scanf ( " %% LF LF " , A [I] .x를, & A [I] .Y);
 80          }
 81          정렬 (A, A + N-, cmp_x)
 82           ( INT I = 0 ; I = N- ;! ++ I) {
 83              A [ I]있는 .index = I // 점 A를 저장해 횡축 후 오름차순으로 배열 된
 84          }
85          를 memcpy (B, A, sizeof의 (A))
 (86)          정렬 (B, B + 상행 // B 좌표 점 메모리에 의해 배열 된 N-, cmp_y)
 87          의 printf ( " % .2lf \ N- " 가장 가까운 (A , B, C, 0 , N- 1. ) / 2 )
 (88)      }
 (89)       0 ,
 90 }

 

추천

출처www.cnblogs.com/pupil-xj/p/11567015.html