[GDOI2016]中学生数学题

6 篇文章 0 订阅
6 篇文章 0 订阅

题目大意

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

其中 n106 0.1k10 p0>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、付费专栏及课程。

余额充值