周练10-跳石头

跳石头

https://ac.nowcoder.com/acm/contest/5986/E

二分答案

分析:和雨巨讲的牛棚放牛类似,这题可以把要移走的石头看成空牛棚,留下的石头看成要跳的石头,然后开始二分答案,假设最短距离中的最长距离是x,那么枚举每块石头的距离,小于这个x的话则这块石头要去掉,然后记录下要去掉的石头数cnt,如果超过了m,说明距离大了,让r=mid - 1,否则距离小了,让l = mid + 1。一直这样下去可以得到最终答案ans。

#include <bits/stdc++.h>
#include <iostream>
const int Max = 100 * 100 * 100 + 5;
#define LL long long
const int mod = 1e9+7;
//const int inx = INT_MAX; 
using namespace std;
//    srand(time(NULL));
//        m = rand() % 1000 + 1;

//定义i i(A) i+n i+n(B) i+n+n i+n+n(C) 
//bitset<Max>s,q;

int a[50005],n,m;

bool pd(int x)
{
    int t = 0,cn = 0;
    for(int i = 1; i <= n; i++){
        if(a[i] - t < x)
            cn++;
        else 
            t = a[i]; 
    }
    if(cn > m) return false;
    return true;
}

int main()
{ 
    int r,l,L,i,j,ans,mid;
    cin >> L >> n >> m;
    for(i = 1; i <= n; i++) cin >> a[i];
    n++;
    a[n] = L;
    l = 0,r = L;
    while(l <= r){
        mid = (r + l) / 2;
        if(pd(mid)){
            ans = mid;
            l = mid + 1;
        }
        else r = mid - 1;
    }
    cout << ans;
    return 0;
}
全部评论

相关推荐

我也曾抱有希望:说的好直白
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务