周练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;
}
联想公司福利 1521人发布
查看8道真题和解析