简单的二分
有 n 个石头,求最短长度的话,二分一下最短长度判断完成。。。
以下是 AC 代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long int
const int maxn = 1e6+5;
ll num[maxn];
int t,m,n;
bool judge(int x)
{
int res = 0, temp = 0;
for(int i=1;i<=n;i++)
{
if(num[i] - temp > x)
return false;
while(num[i] - temp <= x && i <= n)
i++;
temp = num[--i];
res ++;
}
return res<=m;
}
int main()
{
while(~scanf("%d%d%d",&t,&n,&m))
{
for(int i=1;i<=n;i++)
scanf("%lld",&num[i]);
num[++n] = t;
sort(num+1,num+1+n);
int l = 0;
int r = t;
int mid, ans;
while(r - l >= 0)
{
mid = (r+l) / 2;
if(judge(mid))
r = mid - 1,
ans = mid;
else
l = mid + 1;
}
printf("%d\n",ans);
}
return 0;
}