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

[BOJ 8986] 전봇대 본문

PS

[BOJ 8986] 전봇대

LoCeL 2020. 8. 4. 16:44

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


전봇대의 좌표를 $p$의 배수로 통일 시킬 때, 전봇대를 이동시키는 비용은 아래와 같다.

$$f\left(p\right) = \sum \left\vert x_i - pi \right\vert$$

 

따라서, $f\left(p\right)$를 최소화 시키면 되고, 이는 삼분탐색으로 가능하다.

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
45
46
47
48
49
#include<bits/stdc++.h>
 
using namespace std;
 
#define ioinit() ios::sync_with_stdio(false); cin.tie(nullptr);
#define INF INT_MAX
#define LINF LONG_MAX
#define x first
#define y second
#define MOD 1000000007
 
typedef long long lld;
typedef pair<intint> pii;
 
int N, A[100005];
 
lld f(lld x) {
    lld ret = 0;
    for (int i = 0; i < N; i++) {
        ret += abs(i * x - A[i]);
    }
    return ret;
}
 
int main() {
    ioinit();
    cin >> N;
    for (int i = 0; i < N; i++cin >> A[i];
    lld s = 1, e = 1000000000;
    while (e - s > 10) {
        lld a = (s * 2 + e) / 3;
        lld b = (s + e * 2/ 3;
        lld p = f(a);
        lld q = f(b);
        if (p == q) {
            s = a;
            e = b;
        } 
        else if (p > q)
            s = a;
        else
            e = b;
    }
    lld rst = LINF;
    for (int i = s; i <= e; i++)
        rst = min(rst, f(i));
    cout << rst;
    return 0;
}
cs

'PS' 카테고리의 다른 글

[BOJ 11727] 2 x n 타일링 2  (0) 2020.08.05
[BOJ 11724] 연결 요소의 개수  (0) 2020.08.05
[BOJ 17842] 버스노선  (0) 2020.08.04
[BOJ 14867/KOI 2017] 물통  (0) 2020.08.04
[BOJ 17594] Stop Counting!  (0) 2020.08.04
Comments