三分查找&&2021ICPC济南站D题题解

本文介绍了如何使用三分查找解决2021年ICPC济南站的一道数学问题,该问题是寻找使数列变为等差数列的最小操作次数。由于目标函数为凹函数,通过三分查找找到极值。讨论了公差d而非首项a1对答案的影响,并解释了选择中位数作为首项的原因,利用`nth_element`函数高效求解中位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于单调函数,用二分查找,但是对于非单调函数呢?

对于单峰的凹凸函数可以用三分查找。

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值