题目大意:一条路上有三个点,$0$为起始位置,$d$为总部,$m$为家。有$n$辆车,每辆车最多行驶$x_i$,都从$d$出发,可以在任意位置结束,问最少几辆车可以到家。
题解:贪心,发现当人在$[0,d)$时,车子越多,越浪费,所以尽可能用距离远的车。但这样也有可能导致最后没有车子从$d->m$,所以再最开始留下一辆可以的车。
注意判断只需要最后一辆车可以带到$m$,就可以结束循环,还有若无解,输出$0$,而非$-1$
卡点:无解输出了$-1$,应为$0$
C++ Code:
#include <algorithm> #include <cstdio> #include <vector> #define maxn 500010 int n, ans; long long m, d, x; std::vector<long long> s; int main() { scanf("%lld%lld%d", &m, &d, &n); for (int i = 0; i < n; ++i) { scanf("%lld", &x); s.push_back(x); } std::sort(s.begin(), s.end()); long long a = 0; if (m - d) { int p = std::lower_bound(s.begin(), s.end(), m - d) - s.begin(); if (p >= n) { puts("0"); return 0; } a = s[p]; s.erase(s.begin() + p); } std::reverse(s.begin(), s.end()); long long pos = 0, td = d - (a - m + d >> 1); for (long long i : s) { long long t = i - d + pos; if (t <= 0) { puts("0"); return 0; } pos += t; ++ans; if (pos >= td) break; } printf("%d ", ans + (pos < m)); return 0; }