题目大意
给定 nnn 个同学在数轴上的位置 xix_ixi ,每辆车最多载 222 人,且两人之间距离满足 ∣xi−xj∣≤D|x_i-x_j|\le D∣xi −xj ∣≤D 才能拼车。求最少需要多少辆车使所有同学都能回家。
题解思路
要让车辆数最少,就要让“拼车的对数”尽量多,因为每拼成一对就比两人各自打车少用一辆车。
把所有位置 xix_ixi 排序为 p1≤p2≤⋯≤pnp_1\le p_2\le \dots \le p_np1 ≤p2 ≤⋯≤pn 。在有序序列上从左到右扫描:
* 如果 pi+1−pi≤Dp_{i+1}-p_i\le Dpi+1 −pi ≤D,就把这两位同学配成一对,然后跳过这两人;
* 否则 pip_ipi 无法与任何更右侧的人拼车(更右只会更远),只能单独一辆车。
这是最大化不相交配对数的典型贪心:能配就立刻配相邻元素。设配对数为 pairs,答案为
cars=n−pairs.\text{cars}=n-\text{pairs}. cars=n−pairs.
复杂度:排序 O(nlogn)O(n\log n)O(nlogn),扫描 O(n)O(n)O(n)。
参考代码