2019 GDUT Rating Contest #I E. Convention
题目见 :
http://codeforces.com/group/NVaJtLaLjS/contest/238166/problem/E
题目大意:
有n头牛,第i头牛在ti到达,有m辆车,每辆能够载c头牛,求出最小的最长等待时间。
思路:
看见“最小化最大值”,你会不由自主想到“二分”。
一次优化:
用have,used,分别表示当前的积累牛数,已经使用的车数,即可快速模拟。
实现:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,c,t,l,r,mid;
int a[100500];
bool can(int p)
{
int i,j,now=a[1],used=0,have=1;
for (i=2;i<=n;i++)
{
have++;
if (a[i]-now>p||have>c)
{
used++;
now=a[i];
have=1;
}
if (used+1>m||have>c) return false;
}
return true;
}
int main()
{
int i;
scanf("%d %d %d",&n,&m,&c);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
l=0;r=1000000000;
while (r-l>1)
{
// printf("%d %d\n",l,r);
mid=(l+r)/2;
if (can(mid)) r=mid; else l=mid;
}
printf("%d\n",r);
return 0;
}