社区讨论

新手求调

P2678[NOIP 2015 提高组] 跳石头参与者 3已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@mi4hhany
此快照首次捕获于
2025/11/18 19:21
3 个月前
此快照最后确认于
2025/11/20 04:07
3 个月前
查看原帖
各位大佬,我的代码如下:
CPP
#include<bits/stdc++.h>
using namespace std;
int n, d, m, a[50010];

bool check(int k) {
    int cnt = 0, pos = 0;
    for (int i = 1; i <= n + 1; i++) {
        if (a[i] - pos < k) {
            if (i == n + 1) return false; // 终点不能移除
            cnt++;
        } else {
            pos = a[i];
        }
    }
    return cnt <= m;
}

int main() {
    cin >> d >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    a[n + 1] = d;

    int l = 1, r = d, mid, ans = 0;
    while (l <= r) {
        mid = (l + r) / 2;
        if (check(mid)) {
            l = mid + 1;
            ans = mid;
        } else {
            r = mid - 1;
        }
    }
    cout << ans;
    return 0;
}
其中加了注释的部分是我认为如果把最后的终点考虑进去的话,在终点判断a[i]-pos<k成立时,终点是没办法移除的,不应该再对计算移除节点数量cnt加一,但是这样提交上去的话有一个数据点WA了,把这一句删掉就能AC,想了半天实在想不通为什么,难道不应该对终点的位置做特判吗?

回复

11 条回复,欢迎继续交流。

正在加载回复...