POJ 3258 River Hopscotch

xiaoxiao2021-02-28  91

Description

一条大河,长为L。有N个石头,现在要移掉M块,求剩下的石头里最小距离最大是多少

Algorithm

并没有什么好方法能直接算,可以考虑二分答案。 对于二分答案,首先是构造ok函数。参数x表示当前的最小距离。 如果当前距离差 < x,那么需要移掉这个石头。最后比较cnt和m判断x是否可行。 第二个需要考虑的是求最小的还是最大的,此题是求最大的,则往大里找。

Code

#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N(50000 + 9); int a[N], n, m; int mid(int l, int r) { return l + (r - l) / 2; } int ok(int x) { int cnt(0), l(0); for (int i = 1; i <= n+1; i++) { if (i <= n+1 && a[i] - a[l] < x) { cnt++; continue; } l = i; } return cnt <= m; } int main() { //freopen("in", "r", stdin); int L; cin >> L >> n >> m; memset(a, 0, sizeof(a)); for (int i(1); i <= n; i++) cin >> a[i]; a[n+1] = L; sort(a, a + n + 2); int l(0), r(L), ans; while (l <= r) { int m(mid(l, r)); if (ok(m)) l = m + 1, ans = m; else r = m - 1; } cout << ans << endl; }

阅读原文

转载请注明原文地址: https://www.6miu.com/read-72718.html

最新回复(0)