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

被折叠的 条评论
为什么被折叠?



