[GDOI2016]中学生数学题

本文探讨了一个特定的数学优化问题,提出了三种不同的算法解决方案,包括枚举+三分法、三分套三分法以及一种基于直观理解的直接解法。每种方法都针对如何最大化特定函数进行了详细分析,并讨论了各自的适用场景及时间复杂度。

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

题目大意

给定整数n,浮点数p0k,解答一下两个询问:
w=npk(pp0),其中p为自变量,要求最大化函数wnpk0pp0
w=np1k(p1p0)+(np2knp1k)(p2p0),其中p1p2为自变量,要求最大化函数w,且np1k,np2k0p1>p2

其中n1060.1k10p0>0


题目分析

这题出成中考题一定很爽。

Algorithm 1:枚举+三分

由于下取整里面的东西要大于等于0,所以其最多有n种取值。我们通过枚举将它固定。
而且对于一个固定的下取整那一项,第一问中显然p越大越优,第二问(固定第一个下取整)中p1越大越优,这个最大值我们都是可以直接使用数学方法算出来的(这个就不讲了吧)。然后对于第二问中后面的东西怎么做,这是伪二次函数,是单峰的,使用三分即可。
时间复杂度O(nlog1.5n)

Algorithm 2:三分套三分

第一问显然可以三分解决。
第二问我们将其化成另一个形式:w=np1k(p1p2)+np2k(p2p0)
我们拆开来考虑:当p2固定时,前面部分是单峰函数,满足三分的性质。然后我们考虑p2的变化,可以发现,当p2递增的时候,前面部分的最大值是满足单调不递增的(易证),后面部分是单峰函数。因此,w是一个单峰函数加上一个单调不递增函数,显然我们找到单峰函数的峰,它左边部分是单调不递减加上一个单调不递增函数,于是这就变成一个单峰函数,可以三分;右边部分都是单调不递增,加起来显然是单调不递增函数,不会比左边优。所以我们三分找峰顶,在峰顶分成两部分,对左边进行三分即可。
时间复杂度O((log1.5n)2)

Algorithm 3:奇怪的结论解法

数形结合,将函数图像画出来,发现是一个一次函数在第一象限内的线段,求上面某(两)点与坐标轴围成矩形面积(之和)。
第一问是线段中点,第二问线段三等分点。证明自证。
时间复杂度O(1)

(Water)Algorithm 4:二分法

初一某水军使用二分水了过去,我无言以对,数据太强了没办法。

—————————————–我是萌萌哒分割线—————————————–

经过多方查证,我终于听闻了传说中二分求峰法。
二分出中点,然后在中点两边合适精度的地方取点,比较大小,转换区间。
首先这样做如果两边值大小相等,选哪边就变成了玄学。
其次精度开的不够好会被抖出峰顶,开高精度要牺牲时间复杂度。
当然其在随机数据下表现良好。


代码实现

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    printf("题目还没有数据,等到数据来了,切出来再放标程。");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值