题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=586
刚看到题目的时候感觉很难理解,又是最大又是最小的,然后仔细读一读题其实也就是让找两头牛相隔的最大值。思路就是二分查找相隔的距离,当满足题目中的要求的时候,再扩大这个距离,否则减小距离。判断方法就是遍历这些牛的距离,如果有num>=c的话就说明这个距离是可行的。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int pre[100005];
int n,c;
bool judge(int x){
int ans = pre[0];
int num = 1; // pre[0]是必须选出来的
for(int i=1;i<n;i++){
if(pre[i] - ans >= x){
num++;
if(num >= c)return true;
ans = pre[i];
}
}
return false;
}
int main()
{
while(~scanf("%d%d",&n,&c)){
for(int i=0;i<n;i++)scanf("%d",&pre[i]);
sort(pre,pre+n);
int l = 0, r = pre[n-1] - pre[0], mid;
while(l <= r){
mid = (l + r) / 2;
if(judge(mid)){
l = mid + 1;
}
else{
r = mid - 1;
}
}
printf("%d\n",r);
}
return 0;
}