#include<bits/stdc++.h> usingnamespace std; constexprint MAXN = 5e4 + 5; int d[MAXN], s[MAXN]; intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); int L, N, M; cin >> L >> N >> M; for(int i = 1; i <= N; i++) cin >> d[i]; d[N + 1] = L; int l = 0, r = 1e9, ans = 0; while (l <= r) { for(int i = 0; i <= N + 1; i++) s[i] = d[i]; int mid = (l + r) / 2, cnt = 0; for(int i = N + 1; i >= 1; i--) if (s[i] - s[i - 1] < mid) { cnt++; s[i - 1] = s[i]; } if (cnt <= M) { l = mid + 1; ans = max(mid, ans); } else r = mid - 1; } cout << ans; return0; }
这里用的方法是用数组 $s$ 作为数组 $d$ 的副本,还能优化。
用变量 $dis$ 记录上一块石头距离起点的距离,如果枚举到的石头需要移走,则不用更新 $dis$ ,否则更新。此外 ans = max(mid, ans); 可以写成 ans = mid; 。
#include<bits/stdc++.h> usingnamespace std; constexprint MAXN = 5e4 + 5; int d[MAXN]; intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); int L, N, M; cin >> L >> N >> M; for(int i = 0; i < N; i++) cin >> d[i]; d[N] = L; int l = 0, r = 1e9, ans = 0; while (l <= r) { int mid = (l + r) / 2, cnt = 0, dis = 0; for(int i = 0; i <= N; i++) if (d[i] - dis < mid) cnt++; else dis = d[i]; if (cnt <= M) { l = mid + 1; ans = mid; } else r = mid - 1; } cout << ans; return0; }
#include<bits/stdc++.h> usingnamespace std; constexprint MAXN = 1e5 + 5; int a[MAXN]; intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, M, ma = 0; cin >> N >> M; for(int i = 0; i < N; i++) { cin >> a[i]; ma = max(ma, a[i]); } int l = ma, r = 1e9, ans; while (l <= r) { int mid = (l + r) / 2, cnt = 1, acc = 0; for(int i = 0; i < N; i++) { int t = a[i] + acc; if (t > mid) { cnt++; acc = a[i]; } else acc = t; } if (cnt <= M) { ans = mid; r = mid - 1; } else l = mid + 1; } cout << ans; return0; }