boolcheck(int h){ lint sum = 0; for (int i = 1; i <= n; ++i) if (a[i] > h) sum += a[i] - h; return sum >= m; }
intmain(){ std::cin.tie(0)->sync_with_stdio(0); std::cin >> n >> m; for (int i = 1; i <= n; ++i) std::cin >> a[i]; int l = 0, r = *std::max_element(a + 1, a + n + 1) + 1; while (l + 1 != r) { int mid = l + r >> 1; if (check(mid)) l = mid; else r = mid; } std::cout << l << '\n'; return0; }
int n, m, L; int a[50010]; // a[0] = 0, a[n+1] = L
boolcheck(int d){ int cnt = 0, pre = 0; for (int i = 1; i <= n; ++i) { if (a[i] - pre < d) ++cnt; else pre = a[i]; } return cnt <= m; }
intmain(){ std::cin.tie(0)->sync_with_stdio(0); std::cin >> L >> n >> m; for (int i = 1; i <= n; ++i) std::cin >> a[i]; a[n + 1] = L; int l = 0, r = L + 1; while (l + 1 != r) { int mid = l + r >> 1; if (check(mid)) l = mid; else r = mid; } std::cout << l << '\n'; return0; }
实数二分
有些问题的答案是实数,此时将 while (l + 1 != r)
改为精度控制即可。
1 2 3 4 5 6
double l = L, r = R; for (int i = 0; i < 100; ++i) { // 迭代固定次数,比 eps 判断更稳定 double mid = (l + r) / 2; if (check(mid)) l = mid; else r = mid; }