문제: icpc.me/9460
최대중의 최소를 구하는 문제이므로 이분탐색으로 해결할 수 있다.
이 때 검사 조건은 현재 보고 있는 점들의 집합의 최솟값과 최댓값의 차이의 1/2이 mid보다 큰지 확인해주어 클 경우 새로운 수평터널을 생성하면 된다.
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 | #include <cstdio> #include <algorithm> using namespace std; int t, n, k; pair<double, double> dat[10001]; bool posb(double maxdist) { double minn = dat[0].second; double maxx = dat[0].second; int cnt = 1; for (int i = 1; i < n; i++) { if (max(abs(minn - dat[i].second) / 2, abs(maxx - dat[i].second) / 2) <= maxdist) { minn = min(minn, dat[i].second); maxx = max(maxx, dat[i].second); } else { minn = dat[i].second; maxx = dat[i].second; cnt++; } } return cnt > k ? false : true; } int main() { scanf("%d", &t); while (t--) { scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) scanf("%lf%lf", &dat[i].first, &dat[i].second); sort(dat, dat + n); double lo = 0.0; double hi = 100000000000.0; while ((hi - lo) > 0.001) { double mid = (lo + hi) / 2; if (posb(mid)) hi = mid; else lo = mid; } printf("%.1lf\n", lo); } return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)3654 L퍼즐 (0) | 2017.05.17 |
---|---|
BOJ)13308 주유소 (0) | 2017.05.04 |
BOJ)3683 고양이와 개 (0) | 2017.04.27 |
BOJ)2610 회의준비 (0) | 2017.04.24 |
BOJ)5913 준규와 사과 (0) | 2017.04.21 |