这题乍一看很难,其实呢用二分就可以了,什么!?
根据我的理解,这里用二分,起的是筛选的作用。题目问的是最短距离最大,所以呢就用二分来枚举这个距离,把所有小于这个距离的石头搬走,是不是正好M个,就可以了。不过这里有个细节,假如有三个石头A,B,C的位置是:
A______B_______C
在当B被拿走后,原本也要筛走的C就不会被筛,B被拿掉后,距离会变长。
====================程序在此========================
#include <cstdio>
#include <fstream>
#include <iostream>
using namespace std;
int N,M,L;
int a[100100];
int _count(int hi)
{
int last=0,sum=0;
for (int i=1; i<=N+1; i++)
if (a[i]-last<hi) sum++; //注意last
else last=a[i];
return sum;
}
int Ffind(int le,int ri)
{
if (le+1==ri) return ri;
int mid=(le+ri)/2;
if (_count(mid)>M) return Ffind(le,mid-1);
else return Ffind(mid,ri);
}
int main()
{
freopen("stone.in","r",stdin);
freopen("stone.out","w",stdout);
scanf("%d%d%d",&L,&N,&M);
for (int i=1; i<=N; i++) scanf("%d",&a[i]);
a[0]=0; a[N+1]=L;
cout<<Ffind(0,L)<<endl;
}
评论