Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

LoCeL

[UCPC 2019] 이사 풀이 본문

PS

[UCPC 2019] 이사 풀이

LoCeL 2019. 8. 1. 19:37

문제는 여기에서 확인할 수 있다.


가장 가까운 점까지의 거리를 $D_{min}$, 가장 먼 점 까지의 거리를 $D_{max}$라 하자.

최소화 하고 싶은 것은 $\frac{D_{min} + D_{max}}{2}$이므로, $D_{min} + D_{max}$의 값을 최소화하면 된다.

어떤 점에 대해서 두 점 $A$, $B$까지의 거리의 합을 최소화 시키려면, 선분 $AB$위에 점이 놓여 있으면 된다.

그리고 $A$가 가장 가까운 점, $B$가 가장 먼 점이 될 가능성을 높이려면, 어떤 점은 $A$위에 놓여있으면 된다.

이런 관찰을 하고 나면, 나머지는 완전 탐색을 통해서 주어진 조건을 만족하는 점을 손쉽게 찾을 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<bits/stdc++.h>
 
using namespace std;
 
#define ioinit() ios::sync_with_stdio(false), cin.tie(nullptr);
#define INF INT_MAX
 
int N;
int X[1005], Y[1005];
int D[1005][2];
 
inline int distance(int x, int y, int i) {
    return (x-X[i])*(x-X[i]) + (y-Y[i])*(y-Y[i]);
}
 
int main() {
    ioinit();
    cin >> N;
    for (int i = 0; i < N; i++)
        cin >> X[i] >> Y[i];
    
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (i == j) continue;
            if (D[i][0< distance(X[i], Y[i], j)) {
                D[i][0= distance(X[i], Y[i], j);
                D[i][1= j;
            }
        }
    }
    int rst = 0, min = INF;
    
    for (int i = 0; i < N; i++) {
        if (min > D[i][0]) {
            min = D[i][0];
            rst = i;
        }
    }
    
    cout << X[rst] << ' ' << Y[rst];
    
    
    return 0;
}
cs


'PS' 카테고리의 다른 글

[BOJ 14867/KOI 2017] 물통  (0) 2020.08.04
[BOJ 17594] Stop Counting!  (0) 2020.08.04
[KOI'18] XCorr  (0) 2018.11.09
[BOJ 7347] 플립과 시프트  (0) 2018.11.09
[KOI'09] 섞기 수열  (0) 2018.11.09
Comments