//简单两次二分,但是自己在处理边界的时候还是调试了不少时间,,多加练习代码能力才是王道啊 =.= /* ID:1192432 PROG: castle LANG: C++ */ #include <iostream> #include <queue> #include <stack> #include <string> #include <map> #include <vector> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int MAX=50005,INF=1<<30; int l,n,m; int a[MAX],x,y; int bsearch(int v){ int left=0,right=n,mid; while(left<right){ mid=left+(right-left)/2; if(a[mid]>=v) right=mid; else left=mid+1; } return left; } bool solve(int v){//判断小于等于 int pos=0,t=0,cnt=0,ptr=0; while(t<l){ t+=v; pos=bsearch(t); //if(pos>=n) // return 0; if((pos>0&&a[pos-1]==v)|| pos>=n) --pos; cnt+=pos-ptr-1; ptr=pos; t=a[pos]; } //if(v==5) // cout<<"POSSS: "<<cnt<<endl; // if(t>l) // return 0; if(cnt<=m)//分配的最短距离小了或者正好 return 1; return 0; } int main() { #ifndef ONLINE_JUDGE freopen("i.txt", "r", stdin); #endif int mid; cin>>l>>n>>m; for(int i=0;i<n;i++) cin>>a[i]; a[n]=0; a[n+1]=l; n+=2; sort(a,a+n); x=0; y=a[n-1]+1; while(x<y){ mid=x+(y-x)/2; //cout<<x<<" "<<y<<endl; //cout<<"mid: "<<mid<<endl; //if(mid==13) // cout<<"U"<<endl; if(solve(mid)) x=mid+1; else y=mid; } cout<<x-1<<endl; return 0; }