POJ--3258 River Hopscotch(二分搜索/最大化最小值)
记录
10:23 2023-3-11
http://poj.org/problem?id=3259
二分法查找最大的可能解,检查x是否符合条件(当前这个位置上的值 - 前上一个选取位置的值 >= x)
注意的点:
- 使用了[begin, end) 的左闭右开区间,所以结果要begin - 1,end要从L+1开始算
点击查看代码
int L, N, M;
int rocks[50000 + 5];
bool C(int x) {
int last = 0;
int moveCount = 0;
for(int i = 1; i <= N + 1; i++) {
while(i <= N + 1 && rocks[i] - rocks[last] < x) {
i++;
moveCount++;
}
last = i;
}
if(moveCount > M) return false;
return true;
}
int main() {
scanf("%d%d%d", &L, &N, &M);
rocks[0] = 0;
rocks[N + 1] = L;
for(int i = 1; i <= N; i++){
scanf("%d", &rocks[i]);
}
sort(rocks, rocks + N + 1);
// end从L+1开始
int begin = 0, end = L + 1;
// [)
while(begin < end) {
int mid = (begin + end) / 2;
//能否让两个石头之间的距离大于mid
if(C(mid)) {
begin = mid + 1;
} else {
end = mid;
}
}
printf("%d\n", begin - 1);
}