这是一个最小值最大化问题,可以将其转化为二分查找和判定性问题
同样地,最大值最小化问题,也可以将其转化为二分查找和判定性问题
#include <iostream>
#include <memory.h>
#include <math.h>
#include <stdio.h>
#include <unordered_map>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
int N,C;
int location[100005];
bool check( int d )
{
int cnt = 1;
int l = location[0];
for( int i = 1; i < N; i++ )
{
if( location[i] - l >= d )
{
l = location[i];
cnt++;
if( cnt >= C )
return true;
}
}
if( cnt >= C )
return true;
else
return false;
}
int main()
{
cin >> N >> C;
for( int i =0; i < N; i++ )
cin >> location[i];
sort( location, location + N );
int left = 0,right = location[N-1] - location[0];
int mid;
while( left <= right )
{
mid = (left - right) / 2 + right;
if( check(mid) )
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
cout << left - 1 <<endl;//注意最后输出的对象
return 0;
}