SPOJ AGGRCOW的解决方案

时间:2018-11-18 18:08:20

标签: c++

我有以下问题:

  

农夫约翰用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;
}

问题页面: https://www.spoj.com/problems/AGGRCOW/

0 个答案:

没有答案