求助大佬,看了最上面那篇题解,用了二分法,在写judge函数的时候忽然想到应该还要在judge里添加一个bool值来记录是否有两个石头间的距离为mid,结果TLE了,去掉这个bool值就ac了,为什么只要判断需要移开的石头数是否小于等于M就行了啊,就算小于,可能也没有两块石头间的距离刚好等于mid啊```
int L, N, M, al[50010], ans;
//ac的judge
bool judge(int mid) {//判断是否符合要求
int tem = 0, cnt = 0;
for (int i = 0; i <= N + 1; i++) {
for (int j = i + 1; j <= N + 1; j++) {
if (al[j] - al[i] < mid)cnt++;
else {
i = j - 1;
break;
}
}
}
return cnt <= M;
}
//tle的judge
#if(0)
bool judge(int mid) {
int tem = 0, cnt = 0;
bool flag = false;
for (int i = 0; i <= N + 1; i++) {
for (int j = i + 1; j <= N + 1; j++) {
if (al[j] - al[i] < mid)cnt++;
else {
if (al[j] - al[i] == mid)flag = true;
i = j - 1;
break;
}
}
}
return cnt <= M && flag;
}
#endif
int main() {
cin >> L >> N >> M;
al[0] = 0;
for (int i = 1; i <= N; i++) {
cin >> al[i];
}
al[N + 1] = L; //终点位置
int l = 1, r = L + 10, mid = 0;
while (l < r) { //二分
mid = l + (r - l) / 2;
if (judge(mid)) {
ans = mid;
l = mid + 1;
}
else r = mid;
}
cout << ans;
return 0;
}