难度:α
用时:25 min
题目:??
代码:??
这是一道赤裸裸的贪心题。赤裸到和模版题差不多了。
所以下面长话短说。
朴素的算法是直接统计。
在这之上因为要贪心,所以做点小手段,记录一下可以被连带走的物体。
1 for (int i = 0; i < n; i++) { 2 if (taken[i]) continue; 3 ans++; 4 int iter = upper_bound(l, l+n, L-l[i]) - l; iter--; 5 while (iter > i && taken[iter]) iter--; 6 if (iter >= 0) taken[iter] = 1; 7 }
第 2 行就是被带走后的处理。不计数。这样其实效率比较低,我看排行上全是 10 ms 过,然而我 20 ms。(差不多了差不多了~~)
(我懒得写效率高的代码,不划算~~)
那么配对的方法是什么呢?用到了我今天才学会的 upper_bound。没错,我今天才学会。(这不是重点好吗)
upper_bound 找到第一个大于的位置。那么减去一个就是最后一个小于等于的位置。(这是我从紫书上学来的技巧~~)
下面的就是找到一个还没有被带走的物体了。注意边界问题,小心 RE。(我恨 RE !!)
2018-02-05