JZOJ5228 小奇的集合

本文探讨了一个数学问题,即如何通过k次操作(每次操作将集合中两个数相加并重新加入集合)使集合S的元素和最大化。通过分析,发现操作后的数列呈现斐波那契数列特性,为解决大规模数据问题,采用分段打表策略,确保算法在大规模数据集上仍能高效运行。

题意:有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值。(数据保证这个值为非负数)
输出一个整数,表示和的最大值。答案对10000007取模。
对于30%的数据,有 n<=105,k<=105,|ai|<=105
对于100%的数据,有 n<=105,k<=109,|ai|<=105


显然每次取出最大的两个值进行操作
注意到|ai|<=105,所以ai可能为负数,这时把次大值和最大值一直加,知道加出两个正数为止
对于最大的两个正数,设次大值为a,最大值为b,则产生的数为
a+b,a+2b,2a+3b。。。
观察发现系数为斐波那契数列
因为k<=109,考虑分段打表
由于斐波那契数列只需两个连续的数即可递推
则每隔106个数存下两个数
则只需存下30000的代码长度,而时间复杂度为O(106),可以通过

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值