NYOJ-586 疯牛

    xiaoxiao2021-04-16  33

    时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢? 输入 有多组测试数据,以EOF结束。 第一行:空格分隔的两个整数N和C 第二行——第N+1行:分别指出了xi的位置 输出 每组测试数据输出一个整数,满足题意的 最大的最小值,注意换行。 样例输入 5 3 1 2 8 4 9 样例输出 3 //考察贪心+二分; #include <stdio.h> #include <algorithm> //using namespace std; #define Max 100005 int n[Max]; int a,b; void result(); bool judge(int mid); int main() {     int i;     while(~scanf("%d%d",&a,&b))     {         for(i=0;i<a;i++)             scanf("%d",&n[i]);         std::sort(n,n+a);         result();     }     return 0; } void result() {     int left,right,mid;     left=0;     right=n[a-1]-n[0];        while(left<=right)     {         mid=(left+right)/2;         if(judge(mid))  //当这个距离符合条件时,就尝试更大距离是否符合条件             left=mid+1;         else               //当这个距离不符合条件时,就-1;             right=mid-1;     }     printf("%d\n",right); } bool judge(int mid) {     int num,min,i;     num=1;     min=n[0];     for(i=1;i<a;i++)         if(n[i]-min>=mid)         {             min=n[i];             num++;             if(num>=b)                 return true;         }     return false; }
    转载请注明原文地址: https://ju.6miu.com/read-672804.html

    最新回复(0)