1.4 二分
最佳牛围栏
算法:二分。
我们首先要知道二分的本质,本质是什么?是边界。二分时会出现一端满足,一端不满足的情况,而相交处就是边界,二分就是在找这个边界。
我们考虑二分一个答案,判断在一个长度超过 \(f\) 的区间中的最大平均值。可以通过记录一个最小前缀和来进行判断,前缀和的转移:\(sum_i=sum_{i-1}+cowi-mid,mid\) 为二分的值,具体判断长度可以用两个指针,一个指向 \(f\) 个位置之前记录最小前缀和,另一个记录当前前缀和。
最后我们就可以通过二分找到一个最优答案。
特殊排序
算法:二分。
发现这题的数据大小不具有传递性,所以我们考虑怎么把数插入到最终的答案数组中。
这里注意一下,不具有传递性只有一个影响,就是答案不是唯一解,但对于我们的算法没有影响。
我们考虑二分查找插入的位置,假设数组中已经有排好序的 \(a,b,c,d,e\) 几个元素,我们现在要插入 \(f\),这里二分的位置为 \(c\),如果 \(f>c\) 那么 \(f\) 在 \(c,e\) 之间,否则在 \(a,c\) 之间。
所以我们这样二分查找的复杂度为 \(O(nlog n)\),次数不会超过 \(10^4\),所以是可行的。