对于单调函数,用二分查找,但是对于非单调函数呢?
对于单峰的凹凸函数可以用三分查找。
在2021的ICPC济南站中有这么一道题 :
给定一个数列,你可以对任意的一个数字进行减一或者加一的操作,求让这个数列变成等差数列的最小操作次数。
其实就是求解f(d)函数(可以证明这题里这是一个凹函数,不证也可以猜是)的最小值,那么如何求解f(d)函数的极值呢?
为什么这道题答案的大小主要取决于公差d的大小而不是首项a1的大小呢?
我的看法(我觉得没毛病):这是因为对于最优解的公差d和其他解的公差d,当他们使用一样的首项a1时,最优解的答案一定比其他解更优所以首项这个因素可以靠后稍稍。
用三分查找。
对于给定的公差d如何确定数列的首项呢?
设ci=a[i]-(i-1)x,所以最后的答案就是所有ci和首项a1的差值,所以需要选择一个最合适的首项a1。
经过分析可以知道中位数最合适,因为对于这样一个问题:对一个数列,求一个数,使得这个数列中所有的数逐项与这个数的差值的和最小,可以简单证明中位数就是我们要找的数。所以首项的确定就是中位数。
这里简单说一下nth_element(begin,num,end)这个东西,这个函数求数列的第k大很方便,只用o(n)就行,这是基于快速排序的定元,左边的一定比它大,右边的一定比它小。
三分查找的两种形式(个人觉得第二种更方便运用):
//第一种
double solve(double l,double r