看数论证明太累,A水题一枚,二分枚举结果。。。
ACcode:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int nsize=55555;
int L,n,m,maxs,dist;
int stone[nsize];
int Max(int a1,int a2)
{
return a1>a2? a1:a2;
}
int solve(int d)
{
int t=0,step=0;
for (int i=1;i<n;i++)
{
t+=stone[i]-stone[i-1];
if (t>d)
{
step++;
t=stone[i]-stone[i-1];
}
}
if (t>0) step++;
return step;
}
int Fin()
{
int mid,down=maxs,up=L;
while (down<up)
{
mid=(down+up)>>1;
if (solve(mid)>m)
{
down=mid+1;
}
else
{
up=mid;
}
}
return up;
}
int main()
{
while (~scanf("%d %d %d",&L,&n,&m))
{
int t=0;
for (int i=0;i<n;i++)
{
scanf("%d",&stone[i]);
}
stone[n]=0,stone[n+1]=L;
n+=2;
sort(stone,stone+n);
maxs=0;
for (int i=1;i<n;i++)
{
maxs=Max(maxs,stone[i]-stone[i-1]);
}
dist=Fin();
printf("%d\n",dist);
}
return 0;
}