思路分析:要求母牛跳跃最短距离的最大值.暴力的判断肯定不行,复杂度太高.因为每个石头间的距离已知,我们可以通过距离来判断石头是否可以放的下.所以二分法寻找最小距离,然后判断即可.
#include<iostream> #include<algorithm> using namespace std; const int maxsize = 50000 +10; int dis[maxsize],l,n,m,ans,mid; int judge(int x) { // 最小距离为x int last = 0; int num = n - m;//减掉m个石头 int cur;//放置num个石头,循环num次 for(int i = 0; i < num; i++) { //对于这些石头,要使任意间距不小于x cur = last + 1;//当前石头的编号 while(cur<=n&&(dis[cur]-dis[last]<x)) {//>=x才能放石头 cur++;//不满足,则继续判断下一个. } if(cur>n) {//如果石头总数大于n了,则说明距离过大了,能放置的石头太少. return 0; } last = cur;//更新上一块石头的编号.继续判断下一个石头是否可以放置.. } return 1; } int main() { cin>>l>>n>>m; for(int i = 1; i <= n; i++) { cin>>dis[i]; } if(n==m) { cout<<l<<endl;//如果移除的石头数和拥有的石头数相同,则最小距离就是l return 0; } dis[0] = 0; dis[n+1] = l; sort(dis,dis+n+2); int right = l,left = 0; while(left<=right){//二分的模板.. mid = (left+right) / 2; if(judge(mid)){ left = mid+1; ans = mid; }else{ right =mid-1; } } cout<<ans<<endl; return 0; }