博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
假期 题解
阅读量:6081 次
发布时间:2019-06-20

本文共 1002 字,大约阅读时间需要 3 分钟。

【题目描述】

经过几个月辛勤的工作,FJ 决定让奶牛放假。假期可以在 1…N 天内任意选择一段(需要连续),每一天都有一个享受指数 W。但是奶牛的要求非常苛刻,假期不能短于 P 天,否则奶牛不能得到足够的休息;假期也不能超过 Q 天,否则奶牛会玩的腻烦。FJ 想知道奶牛们能获得的最大享受指数。

【输入】

第一行:N,P,Q. 第二行:N 个数字,中间用一个空格隔开。

【输出】

一个整数,奶牛们能获得的最大享受指数。

【样例输入】

5 2 4

-9 -4 -3 8 -6

【样例输出】

5

【样例解释】

选择第 3-4 天,享受指数为-3+8=5

【数据范围】

50% 1≤N≤10000

100% 1≤N≤100000

1<=p<=q<=n

=================题解================

        前缀和 + dp + 单调队列。

        写了树状数组。。。。但是树状数组求区间和比前缀和要慢啊。。。

        首先前缀和,sum[i] = sum[i - 1] + sum[i – 2];所以对于区间[i,j],区间和sum(i,j) = sum[j] – sum[i],其中j – q <= i <= j – p;这时可以发现,若要sum(i,j)尽量大,那么=sum[i]要尽量小,这时要用单调递增队列维护i的区间,队列中存sum数组的下标。

        单调队列满足两个性质:

            1.单调队列必须满足从队头到队尾的严格单调性。

            2.排在队列前面的比排在队列后面的要先进队。

        元素进队列的过程对于单调递增队列,对于一个元素a 如果 a > 队尾元素,那么直接将a扔进队列;如果 a <= 队尾元素 则将队尾元素出队列,直到满足 a 大于队尾元素即可。

        枚举j从p到n,即枚举右端点,对于每个枚举的右端点,更新单调队列,首先要保证head始终<= tail,当队尾元素的值sum[que[tail]] > 当前要进队的元素的值sum[j – p]时,队尾的标记tail要前移,tail--;之后队尾元素更新为j – p;对于队首,要保证q[head] > j – q,所以head要++,直到满足。这样更新完成后,队首元素的值就是最小的了,此时在ans与sum[j] – sum[q[head]]间取max。

转载于:https://www.cnblogs.com/linjia64/p/9607149.html

你可能感兴趣的文章
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>
Linux系统磁盘管理
查看>>
hdu 2191 (多重背包+二进制优化)
查看>>
home.php
查看>>
neo4j---删除关系和节点
查看>>
redis分布式锁redisson
查看>>
什么样的企业可以称之为初创企业?
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>
Linux--sed使用
查看>>
没有显示器的情况下安装和使用树莓派
查看>>
Q85 最大矩形
查看>>