题目传送门
sol:很基础的二分答案板子题。一开始方向搞错了往动规贪心那边想了,想了一个多小时都没思路。
- 二分答案
#include "cstdio" #include "algorithm" using namespace std; const int MAXN = 1e5 + 5; int arr[MAXN]; int n, m, c; bool check(int t) { int k = 1; // k表示每辆车第一头到达的牛的编号 for (int i = 1; i <= m; i++) { k = min(k + c, upper_bound(arr + 1, arr + 1 + n, arr[k] + t) - arr); if (k > n) return true; } return false; } int main() { scanf("%d%d%d", &n, &m, &c); for (int i = 1; i <= n; i++) scanf("%d", &arr[i]); sort(arr + 1, arr + 1 + n); // r表示当前最小可行答案,l表示当前最大不可行答案 int l = -5, r = 1e9 + 5; while (r - l > 1) { int mid = l + r >> 1; if (check(mid)) r = mid; else l = mid; } printf("%d\n", r); return 0; }