[HYSBZ] 1734 — Aggressive cows 愤怒的牛
原题链接:https://vjudge.net/problem/1642056/origin
题目大意:
有N个隔间x1,…,xN,给C头牛分配隔间,使任意两头牛之间的最小距离尽可能的大,求这个最大的最小距离。
题目分析:
数据太大,直接遍历所有的最小距离肯定不行。先排序,再运用二分,一步步逼近最大距离。
代码实现:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, c;
int a[100001];
bool cow(int x)
{
int i, j;
int num = 1; //已经住下的牛的数目,第一头牛一定在第一间隔间
for(i=0,j=0; i<n; i++){
if(a[i] - a[j] >= x){ //每相邻大于或等于x的隔间就住一头牛
num++;
j = i;
}
}
if(num >= c) return true; //判断能住下的是否大于c
else return false;
}
int main()
{
int i;
int l, r, mid;
cin >> n >> c;
for(i=0; i<n; i++){
cin >> a[i];
}
sort(a,a+n);
max_x = 0;
l = 0;
r = a[n-1];
//二分取可能的值(最大的最小距离)
while(l < r)
{
mid = (l + r) / 2;
if(cow(mid)) l = mid+1;
else r = mid;
}
cout << r-1 << endl;
return 0;
}
最后,希望路过的dl们能给予改进的建议!