题意: 问一个河岸,两岸之间有笔直的n块石头,然后拔起(也可以施展魔法)m个石块,假设两岸也是石块,求处理过的石块的最小距离的最大。 思路: 他让我们求移开m个石块,无非是在n+2-m(已经把两岸看成了石块)块里找一个最小距离最大,然后就是二分距离,然后判断条件是存在符合>=x(二分的距离)的石块>=n+2-m个; 二分模型是11111111111100000000000,求满足条件最右; 贴一发挫code…
//#include <bits/stdc++.h> #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=1e5+10; int a[N]; int n,c,m; bool Judge(int s) { int cnt=1; int cur=0; for(int i=1;i<=n+1;i++) { if(a[i]-cur>=s) { cnt++; cur=a[i]; if(cnt>=m) return true; } } return false; } int main() { scanf("%d%d%d",&c,&n,&m); a[0]=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]); a[n+1]=c; sort(a,a+n+2); m=n+2-m; int s=0; int t=c; while(s<t) { int mid=s+(t-s+1)/2; if(Judge(mid)) s=mid; else t=mid-1; } printf("%d\n",s); return 0; }