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 | #include<cstdio> #include<algorithm> using namespace std; int arr[200000] = { 0 }; // 집의 좌표 int dist[200000] = { 0 }; // 집 사이 거리 int max(int a, int b) { return a > b ? a : b; } int main() { int n, c; int maxv = 0; scanf("%d %d", &n, &c); for (int i = 0; i < n; ++i) scanf("%d", arr + i); sort(arr, arr + n); for (int i = 1; i < n; i++) dist[i] = arr[i] - arr[i - 1]; long long lo = 1, hi = arr[n - 1]; long long mid; int count; while (lo <= hi) { int now = 0, next = 1; long long dsum = 0; count = 0; mid = (lo + hi) / 2; while (now < n) { dsum += dist[next]; if (dsum >= mid || next == n - 1) { now = next; dsum = 0; count++; } next++; if (next == n) { break; } } if (count >= c) lo = mid + 1; else hi = mid - 1; } printf("%lld", hi); } | cs |
https://www.acmicpc.net/problem/2110
이분탐색으로 거리 mid를 정하고 mid 이상 벌어지면 공유기를 놓는 식으로 했는데 47%에서 자꾸 WA가 나와요
혹시 어느 부분이 잘못됬다고 생각하시는지 고견을 여쭙고자 합니다
https://www.acmicpc.net/problem/2110
언제나 최적은 거리/공유기 수. 양끝에 두개 박고 남은거리/남은공유기로 나온 최적의 거리와 니가 위치시킬 공유기 위치의 거리 비교.