【題解】洛谷P2678 跳石頭(二分)
阿新 • • 發佈:2018-12-10
1-1e9二分答案,設其為最短距離。判斷如果該距離可以就向上二分(單調遞增,求最大值),注意判斷mid+1可以避免邊界問題。
判斷函式統計移走石頭個數,如果相鄰石頭之間距離比要的最短距離還小就移走。移走石頭個數小於M就返回true
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn=50010; int L,M,N; int a[maxn]; bool pd(int x) { int cnt=0,last=0,i=0; while(i<=N) { i++; while(i<=N&&a[i]-last<x) { i++,cnt++; } last=a[i]; } if(cnt<=M) return true; else return false; } int main() { cin>>L>>N>>M; for(int i=1;i<=N;i++) { scanf("%d",&a[i]); } N++; a[N]=L; int l=1,r=1e9; while(l<r) { int mid=(l+r)/2; if(pd(mid+1)==true) l=mid+1; else r=mid; } printf("%d",l); return 0; }