※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 26072번 문제인 곰곰이와 시소이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/26072
26072번: 곰곰이와 시소
첫번째 줄에 정수 $N$과 $L$이 공백을 사이에 두고 주어진다. $(1 \le N, L \le 100\,000)$ 두번째 줄에 정수 $x_1, x_2, \cdots, x_N$이 공백을 사이에 두고 주어진다. $(0 \le x_i \le L)$ 세번째 줄에 정수 $w_1, w_2, \c
www.acmicpc.net
받침점의 위치 x가 점점 커지면 커질수록 시소는 점점 왼쪽으로 기울어지는 관계가 있음을 관찰하자. 이를 이용해 x의 위치를 이진탐색(binary search)을 통해 구해낼 수 있다.
탐색 범위가 충분히(문제에서 요구하는 오차범위 이내로) 작아질 때까지 이진탐색을 반복하는 것으로 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long double ld;
typedef pair<int, int> pii;
int N, L;
pii arr[100000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed;
cout.precision(10);
cin >> N >> L;
for (int i = 0; i < N; i++) cin >> arr[i].first;
for (int i = 0; i < N; i++) cin >> arr[i].second;
ld l = 0, r = L;
while (r - l > 0.000000001) {
ld mid = (l + r) / 2;
ld val = 0;
for (int i = 0; i < N; i++) {
ld x = arr[i].first, w = arr[i].second;
val += (x - mid) * w;
}
if (val > 0) l = mid;
else r = mid;
}
cout << (l + r) / 2;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 26069 // C++] 붙임성 있는 총총이 (0) | 2022.12.01 |
---|---|
[BOJ 2168 // C++] 타일 위의 대각선 (0) | 2022.12.01 |
[BOJ 25812 // C++] Nice Raises (0) | 2022.11.30 |
[BOJ 7420 // C++] 맹독 방벽 (0) | 2022.11.30 |
[BOJ 25761 // C++] 축사 건설 (0) | 2022.11.29 |