以右端点从第一天扫到最后一天。以某一天结尾的最优段只有两种来源:这一天单独成段,或者接在「以昨天结尾的最优段」后面。
三段比较按同一个顺序:净额更大的更好;净额相同则天数更多的更好;再相同则起始日更早的更好。因此累计被抹成 0 时,仍然保留更长的那段,不会因为暂时不赚就从下一天重开。
全局答案就是每个右端点上的最优段里,按上面顺序最好的一个。起始日从 1 计。天天亏损时,答案是亏损最少的那一天;有两天一样少时,取更早的一天。
一家门店把每天的盈亏记成整数,亏钱就是负数。请从这串日账里截出一段连续营业日,至少包含一天,使这些天的盈亏相加最大。
相加结果一样时,留下天数更多的那段。天数也一样时,留下开始得更早的那段。
第 i 天的盈亏是 vi。若从第 s 天起连续取 d 天,净额就是 vs+vs+1+⋯+vs+d−1。天数 d 至少为 1,并且不能越过最后一天。
只有一行。第一个整数是天数 m,后面还有 m 个整数 v1,v2,…,vm。
1≤m≤2×105
−109≤vi≤109
日账累加后可能超出 32 位有符号整数,计算时使用 64 位整数。
输出三行,每行一个整数:
第一行是起始日 s,从 1 开始编号。
第二行是天数 d。
第三行是对应净额。
输入
7 1 -3 4 -1 2 1 -5
输出
3
4
6
说明
从第 3 天到第 6 天:4+(−1)+2+1=6。只取第 3 天是 4,第 5 天到第 6 天是 3,都更小。
输入
6 -4 -8 -2 -7 -2 -9
输出
3
1
-2
说明
天天都在亏,多取一天只会更小,所以只留亏得最少的那一天。第 3 天和第 5 天都是 −2,开始更早的是第 3 天。
输入
5 2 -2 1 1 0
输出
1
5
2
说明
整段 2+(−2)+1+1+0=2,只有第一天也是 2。净额相同,整段有 5 天,更长。中间那次亏完把累计抹平后,后面再赚回来的部分仍然应该接在同一段里。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册