我有以下问题:
农夫约翰用N建造了一个新的长谷仓(2 <= N <= 100,000) 摊位。档位沿直线位于 x1,...,xN(0 <= xi <= 1,000,000,000)。
他的C(2 <= C <= N)头母牛不喜欢这种谷仓布局而成为 一旦陷入僵局,就会互相攻击。为了防止 母牛互相伤害,FJ希望将母牛分配给 失速,使得它们中的任何两个之间的最小距离为 尽可能大。最大最小距离是多少?
输入
t –测试用例的数量,然后是t个测试用例。 *第1行:两个以空格分隔的整数:N和C *第2..N + 1行:第i + 1行包含一个整数档位xi
输出
对于每个测试用例,输出一个整数:最大最小距离。
示例
输入:
1
5 3
1
2
8
4
9
输出:
3个输出详细信息:
FJ可以将他的3头母牛放进1号,4号和8号的摊位 导致最小距离为3。提交解决方案!
我的方法是选择一对具有一定间隙的对,并检查数组中是否有足够的元素满足所有母牛的需求。 为了找到这些元素,我使用了二进制搜索。
当我找到一个元素时,我将左手重置为中点,这样我就可以根据剩下的母牛数量继续操作。
我的代码:
#include <iostream>
int bsearch(int arr[],int l,int r,int gap , int n,int c){
int stat = 0;
for (int i = 1;i <= c; ++i) {
while(l <= r) {
int mid = (l+r)/2;
int x = n+(i*gap);
if (arr[mid] > x && arr[mid-1] < x) {
l = mid;
++stat;
break;
}
if(arr[mid] < x) {
l = mid + 1;
}
if (arr[mid] > x) {
r = mid - 1;
}
}
}
if (stat == c) {
return 0;
}
else {
return -1;
}
}
int calc(int arr[],int n , int c) {
int max = 0;
for (int i = 0; i < n; ++i) {
for (int j = i+1;j < n; ++j) {
int gap = arr[j] - arr[i];
if (gap > max) {
if (bsearch(arr,j,n-1,gap,arr[j],c) == 0) {
max = gap;
}
}
}
}
return max;
}
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t , n ,c;
cin >> t;
for(int i = 0 ; i < t; ++i) {
cin >> n >> c;
int arr[n];
for (int z = 0 ; z < n; ++z) {
cin >> arr[z];
}
sort(arr,arr+n);
//Output;
int ans = calc(arr,n,c);
cout << ans;
}
return 0;
}