[NOIP2015]跳石头
[USACO 2009 Dec S]Music Notes
https://ac.nowcoder.com/acm/contest/22353/A
AC 代码
#include <bits/stdc++.h>
using namespace std;
long long int a[50010];
long long int L;
int N;
bool test(long long int x, int M){
long long int stone[50010];
int k = 0;
int p = 0;
int q = 1;
while(q < N + 1){
if(a[q] - a[p] >= x) {
stone[++k] = p;
p = q; q++;
}else{
q++;
M--;
}
}
long long int right = a [N+1];
long long int left = a[p];
while( right - left < x){
if(k <= 0) return 0;
left = a[stone[k--]];
M--;
}
if(M >= 0 ) return 1;
return 0;
}
int main(int argc, const char * argv[]) {
int M;
scanf("%lld", &L);
cin >> N >> M;
a[0]= 0;
for(int i = 1 ; i <= N ; i++){
cin >> a[i];
}
a[N + 1] = L;
long long int l = 0;
long long int r = L;
while ( l <= r) {
long long int mid = (l + r)/ 2;
// cout <<"FLSH" << l << " " << mid << " "<< r << endl;
if(test(mid, M)) l = mid + 1;
else r = mid - 1;
}
cout << r << endl;
// cout << test(2);
return 0;
}
需要注意 :1 M不能是全局变量, 每次要传参。
2 双指针部分有些难