题目:P5119 [USACO18DEC]Convention
二分 - 贪心
题目大意
n n n 头奶牛, m m m 辆大巴,每头牛有一个到达时间,求怎样设计坐车方案使得等待时间最久的奶牛的等待时间最少
这题其实没有蓝吧,顶多也就是个绿,二分 + 贪心就好了
我们二分等待最久的时间 x x x,但在对应设计的方案中,不一定有牛的等待时间会达到 x x x,只是保证等待时间不超过 x x x
对于每一次二分的 x x x,我们让每辆大巴尽可能多做人,且满足等待时间最久不超过 x x x,最后输出就好啦
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int Maxn=100000+20,inf=0x3f3f3f3f;
int n,m,k;
int a[Maxn];
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
bool check(int x)
{
int cnt=0;
for(int i=1;i<=n;++i)
{
int j=i;
while(j-i+1<=k && a[j]-a[i]<=x && j<=n)++j;
--j;
++cnt,i=j;
if(cnt>m)return 0;
}
return 1;
}
int main()
{
n=read(),m=read(),k=read();
for(int i=1;i<=n;++i)
a[i]=read();
sort(a+1,a+1+n);
int l=0,r=a[n]-a[1],mid;
while(l<r)
{
mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
printf("%d\n",l);
return 0;
}