NC24017 [USACO 2016 Jan S]Angry Cows
作者:互联网
题目
- 原题地址:[USACO 2016 Jan S]Angry Cows
- 题目编号:NC24017
- 题目类型:二分答案
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 262144K,其他语言524288K
1.题目大意
- 给 k 头牛,目标打掉 n 堆稻草, 每头牛的打击范围为 [x-r,x+r](降落点为 x),求最小的 r
2.题目分析
- 二分即可,注意牛的降落位置可以没有草堆
- 对于 check 函数里的初始条件,我们一定会打到第一捆草,它是第一头牛降落位置的左边界
- 假设左边界位置为 x1,右边界为 x2,牛的降落位置为 x
- 牛的打击范围为 [x-r,x+r],即 x1 = x -r, x2 = x + r
- 推一下得到
x1 + r = x2 -r
- 代码中 left = x1 + r, 所以就有边界条件
x[i]-r>left
判断能否打到右边界附近的点
3.题目代码
#include <bits/stdc++.h>
using namespace std;
int n, k;
int x[50004];
bool check(int r){
int sum = 1;
int left = x[0] + r;
for(int i=1;i<n;i++){
if(x[i]-r>left)
{
sum++;
left = x[i] + r;
}
if(sum>k)
return false;
}
return true;
}
int main() {
cin >> n >> k;
for(int i=0;i<n;i++)
cin >> x[i];
sort(x,x+n);
int l = 0;
int r = x[n-1];
int ans;
while(l<=r){
int mid = (l + r) / 2;
if(check(mid)){
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
cout << ans << endl;
}
标签:NC24017,题目,int,Angry,USACO,x2,x1,sum,left 来源: https://www.cnblogs.com/zhangyi101/p/16546126.html