POJ——2456 疯狂的牛

原题链接:http://poj.org/problem?id=2456

题意:

在这里插入图片描述
这题意不用解释了吧

题解:

求最小值的最大值,先对隔间的位置进行排序,隔间之间的最小值最大为最后那个隔间的位置减去第一个隔间的位置,这样的话我们就可以二分了,判断每俩头牛之间最小相距mid距离时,能否装下c头牛,如何判断也是一个值得注意的地方,肯定要把第一个隔间的位置放一头牛,贪心的思想,然后判断下一个隔间的位置与上一个放牛的位置的距离是否大于等于mid,符合条件则放入,并把上一个放牛的位置改为当前位置

标程

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N];
int n,m;
int judge(int x)
{
   int num=1;
   int pos=a[1];
   for(int i=2;i<=n;i++)
   {
       if(a[i]-pos>=x)
       {
           num++;
           pos=a[i];
       }
   }
   if(num>=m)
   {
       return 1;
   }
   else
   {
       return 0;
   }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    sort(a+1,a+1+n);
    int l=0,r=1e9;
    int ans;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(judge(mid))
        {
            l=mid+1;
            ans=mid;
        }
        else
        {
            r=mid-1;
        }
    }
    printf("%d\n",ans);
    return 0;
}

发布了42 篇原创文章 · 获赞 5 · 访问量 916

猜你喜欢

转载自blog.csdn.net/qq_43402296/article/details/103915469