单调队列-hdu-3415-Max Sum of Max-K-sub-sequence
来源:互联网 发布:mac口红吧怎么看真假 编辑:程序博客网 时间:2024/06/05 18:36
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3415
题目大意:
给n个数凑成环状,求某一区间,使得该区间长度不超过k,且总和最大。
解题思路:
区间总和,很容易想到保存前缀和,区间【i,j】的和即为sum[j]-sum[i].
对于每一个以j结束的区间,求出最小的i,(i>=j-k),也即使得sum[j]-sum[i]最大。
所以可以用单调队列维护一个最小的sum[i],对于每一个j,压进j-1.(因为是要减去前面的)
代码:
#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#include<ctime>#define eps 1e-6#define INF 0x3f3f3f3f#define PI acos(-1.0)#define ll __int64#define lson l,m,(rt<<1)#define rson m+1,r,(rt<<1)|1#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define Maxn 110000int sa[Maxn];int sum[Maxn<<1];int q[Maxn<<1];int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int t,n,k; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); sum[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&sa[i]); sum[i]=sum[i-1]+sa[i]; } for(int i=n+1;i<n+k;i++) sum[i]=sum[i-1]+sa[i-n]; //n+=k-1; int head=0,tail=0,s,e; int ans=-INF; q[0]=0; for(int i=1;i<n+k;i++) { while(head<=tail&&sum[i-1]<=sum[q[tail]])//保证最短 tail--; q[++tail]=i-1; while(q[head]+1<i-k+1) head++; if(sum[i]-sum[q[head]]>ans)//保证初始位置最小 { ans=sum[i]-sum[q[head]]; s=q[head]+1; e=i; } } printf("%d %d %d\n",ans,s,e>n?e%n:e); } return 0;}
- HDU Max Sum of Max-K-sub-sequence(单调队列)
- hdu 3415 Max Sum of Max-K-sub-sequence【单调队列】
- HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
- HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
- HDU 3415 Max Sum of Max-K-sub-sequence[单调队列优化dp]
- 【单调队列】hdu 3415 Max Sum of Max-K-sub-sequence
- hdu 3415 Max Sum of Max-K-sub-sequence 单调队列dp
- HDU 3415(Max Sum of Max-K-sub-sequence-单调队列优化DP)
- hdu 3415 Max Sum of Max-K-sub-sequence (单调队列)
- HDU--杭电--3415--Max Sum of Max-K-sub-sequence--暴力或单调队列
- HDU 3415 Max Sum of Max-K-sub-sequence【单调队列】
- HDU--3415--Max Sum of Max-K-sub-sequence--单调队列
- hdu 3415 Max Sum of Max-K-sub-sequence (单调队列)
- 单调队列-hdu-3415-Max Sum of Max-K-sub-sequence
- 单调队列——HDU 3415 Max Sum of Max-K-sub-sequence
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
- 混音器原理及Mixer API函数介绍
- 面试题。。虽然没有答案,但是能激发自己的想象
- 并发服务器:多路复用I/O
- 浮点数的二进制表示
- linux zip压缩命令解压命令
- 单调队列-hdu-3415-Max Sum of Max-K-sub-sequence
- [各种面试题] 将一棵普通二叉树转换为一棵线索二叉树
- Java核心技术,让计算机"一芯多用"的多线程技术
- POJ 3678 Katu Puzzle (2-sat,4级)
- 俞敏洪+马云+牛根生+史玉柱经典语录
- Ubuntu下Samba服务器的搭建
- 一天之内可以完成的事
- 如何合并apk和odex文件
- poj 1696 Space Ant(计算几何)