https://acmicpc.net/problem/9998

해설
파라메트릭 서치를 이용하면 금방 풀 수있다.
f(x) 식 :
sum += abs(y[i] - (h + abs(n / 2 + 1 - i))) + abs(d[i] - (h + abs(n / 2 + 1 - i))); |
···
소스코드
#include <iostream>
using namespace std;
typedef long long int ll;
ll n;
ll y[300001], d[300001];
ll f(ll h) {
ll sum = 0;
for(int i=1; i<=n; i++)
sum += abs(y[i] - (h + abs(n / 2 + 1 - i))) + abs(d[i] - (h + abs(n / 2 + 1 - i)));
return sum;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> y[i];
for (int i = 1; i <= n; i++)
cin >> d[i];
ll lo=0, hi=1e12+1, h;
while (lo < hi - 1) {
h = (lo + hi) / 2;
if (f(h) - f(h - 1) <= 0) lo = h;
else hi = h;
}
cout << f(lo) << '\n';
}
'백준 문제 풀이' 카테고리의 다른 글
[백준 2568] 전깃줄 - 2 (0) | 2020.04.02 |
---|---|
[백준 14003] 가장 긴 증가하는 부분 수열 5 (0) | 2020.04.02 |
[백준 12015] 가장 긴 증가하는 부분 수열 2 (0) | 2020.04.02 |
[백준 2565] 전깃줄 (0) | 2020.04.01 |
[백준 5397] 키로거 (0) | 2020.03.31 |
댓글