题解思路
塔子哥希望找到连续 x 天内可以获得最多金币的方案。为了实现这一目标,我们的日历数据是一个长度为 n 的数组 d,其中每个元素表示每个月的天数。由于塔子哥可以跨越到下一年的第一个月,因此我们需要考虑跨年情况。为了解决这个问题,我们采用了以下思路:
-
双倍日历数组:将日历数组 d 复制一份,形成一个长度为 2n 的数组。这一做法确保我们可以在任何地方找到长度为 x 的连续天数,并且能够平滑地处理跨年情况。
-
滑动窗口算法:我们通过滑动窗口的方式来计算在不同起点下,连续 x 天可以获得的金币总数。窗口的初始位置从 0 开始,每次移动一格,尝试不同的起点。
-
动态调整窗口:在窗口滑动过程中,维护当前窗口中的天数和金币总和。如果当前窗口内的天数和大于 x,则从左侧移除天数,直到窗口中的天数和小于等于 x。
P2340.第2题-大礼包
某公司日对新用户推出大礼包,从任意一天注册开始,连续登录x天,每天可以领取一定的金币,领取金币的数量与该公司新设计的虚假世界的日历相关,该日历一年有n个月,第i个月有di天,每一年都一样。在每个月第一天会得到1个金币,第天会得到2个金币币第三天会得到3个金币,后面次类推。
请计算新用户注册后连续登陆x天,最多可以获取多少金币。
请注意,连续登陆可能会跨年。
解答要求
时间限制:C/C++ 500ms,其他语言:1000ms
内存限制:C/C++ 256MB, 其他语言:512MB
输入
第一行包含两个整数n和x(1≤n≤2∗105),分别表示一年中的月数和连续登陆的天数。第二行包含 n 个整数 d1,d2,...,dn,di表示第i个月的天数(1≤di≤106)
用例保证,1≤x≤d1+d2+...+dn。
输出
打印新用户连续号陆x天最多可以获取的金币数量
样例1
输入
3 2
1 3 1
输出
5
解释
一年中每天获取的金币数是{1,1,2,3,1}(对应每个月中的天数)。如果在一年中的第3天开始注册陆,最多可以获取 2+3=5 个金币。
样例2
输入
3 6
3 3 3
输出
12
解释
一年中每天获取的金币数是{1,2,3,1,2,3,1,2,3}(对应每个月中的天数)。如果在一年中的第12天开始注册登陆,最多可以获取3+1+2+3+1+2=12个金币.
样例3
输入
5 6
4 2 3 1 3
输出
15
解释
一年中每天获取的金币数是{1,2,3,4,1,2,1,2,3,1,1,2,3}(对应每个月中的天数)。如果在一年中的第12天开始注册登陆,最多可以获取2+3+1+2+3+4=15个金币