HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
转载请注明出处:http://blog.csdn.net/u012860063
Max Sum of Max-K-sub-sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5791 Accepted Submission(s): 2083
Now your job is to calculate the max sum of a Max-K-sub-sequence. Max-K-sub-sequence means a continuous non-empty sub-sequence which length not exceed K.
Then T lines follow, each line starts with two integers N , K(1<=N<=100000 , 1<=K<=N), then N integers followed(all the integers are between -1000 and 1000).
start position, if still more than one , output the minimum length of them.
4
6 3
6 -1 2 -6 5 -5
6 4
6 -1 2 -6 5 -5
6 3
-1 2 -6 5 -5 6
6 6
-1 -1 -1 -1 -1 -1
7 1 3
7 1 3
7 6 2
-1 1 1
附上别人的思路:
单调队列即保持队列中的元素单调递增(或递减)的这样一个队列,能够从两头删除。仅仅能从队尾插入。单调队列的详细作用在于。因为保持队列中的元素满足单调性,对于上述问题中的每一个j,能够用O(1)的时间找到相应的s[i]。(保持队列中的元素单调增的话,队首元素便是所要的元素了)。
维护方法:对于每一个j,我们插入s[j-1](为什么不是s[j]?
队列里面维护的是区间開始的下标,j是区间结束的下标)。插入时从队尾插入。为了保证队列的单调性,我们从队尾開始删除元素,直到队尾元素比当前须要插入的元素优(本题中是值比待插入元素小。位置比待插入元素靠前。只是后面这一个条件能够不考虑),就将当前元素插入到队尾。之所以能够将之前的队列尾部元素所有删除,是由于它们已经不可能成为最优的元素了。由于当前要插入的元素位置比它们靠前,值比它们小。我们要找的,是满足(i>=j-k+1)的i中最小的s[i],位置越大越可能成为后面的j的最优s[i]。
在插入元素后,从队首開始,将不符合限制条件(i>=j-k+1)的元素所有删除,此时队列一定不为空。
(由于刚刚插入了一个一定符合条件的元素)
代码例如以下:(看了别人的才做出来的,汗)
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
#define INF 0x3fffffff
int sum[100047],a[200047];
int main()
{
int t,i,n,m,k,head,end;
scanf("%d",&t);
while(t--)
{
memset(sum,0,sizeof(sum));
scanf("%d%d",&n,&k);
for(i = 1 ; i <= n ; i++)
{
scanf("%d",&a[i]);
sum[i] = sum[i-1]+a[i];//将前i项和所有存入sum数组中
}
for(i = n+1 ; i < n+k ; i++)
{
sum[i] = sum[i-1]+a[i-n];//将前n+k-1项和所有存入sum数组中
}
int ans = -INF;//初始化ans为最小
deque<int>Q;
Q.clear();//清空双向队列
for(i = 1 ; i < n+k ; i++)
{
while(!Q.empty() && sum[i-1] < sum[Q.back()])//保持队列的单调性(递增)
Q.pop_back();
while(!Q.empty() && i-k > Q.front())//超过k的长度则消除队列前面的元素
Q.pop_front();
Q.push_back(i-1);
if(ans < sum[i]-sum[Q.front()])//假设当前的值比ans大就更新ans的值
{ //记录,sum[n]-sum[m]所得出的是n-1到m+1之间的和
ans = sum[i]-sum[Q.front()];
head = Q.front()+1;
end = i;
}
}
if(end > n)//标记的点大于了n则循环
end%=n;
if(head > n)//标记的点大于了n则循环
head%=n;
printf("%d %d %d\n",ans,head,end);
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)的更多相关文章
- HDU 4123 Bob's Race:树的直径 + 单调队列 + st表
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...
- HDU 4193 Non-negative Partial Sums(想法题,单调队列)
HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...
- HDU 5945 / BestCoder Round #89 1002 Fxx and game 单调队列优化DP
Fxx and game 问题描述 青年理论计算机科学家Fxx给的学生设计了一款数字游戏. 一开始你将会得到一个数\:XX,每次游戏将给定两个参数\:k,tk,t, 任意时刻你可以对你的数执行下面 ...
- HDU 3410 && POJ 3776 Passing the Message 单调队列
题意: 给定n长的数组(下标从1-n)(n个人的身高,身高各不同样 问:对于第i个人,他能看到的左边最矮的人下标.(假设这个最矮的人被挡住了,则这个值为0) 还有右边最高的人下标,同理若被挡住了则这个 ...
- hdu 1003 Max Sum (DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1081:To The Max
To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- hdu 3415 单调队列
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 3530 单调队列
题目大意:给你n个数, 让你问你最长的满足要求的区间有多长,区间要求:MAX - MIN >= m && MAX - MIN <= k 思路:单调队列维护递增和递减,在加入 ...
- HDU 3415 Max Sum of Max-K-sub-sequence 最长K子段和
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3415 意甲冠军:环.要找出当中9长度小于等于K的和最大的子段. 思路:不能採用最暴力的枚举.题目的数据量是 ...
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
题目链接:hdu 3415 Max Sum of Max-K-sub-sequence 题意: 给你一串形成环的数,让你找一段长度不大于k的子段使得和最大. 题解: 我们先把头和尾拼起来,令前i个数的 ...
随机推荐
- Functor仿函数
转载声明:本文转自网络,稍加整理以备学习和參考之用. 函数对象/仿函数 提到C++ STL.首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭 ...
- 安装IntelliJ IDEA JetGroovy(转)
JetGroovy是一个免费而且开源的专用于支持Groovy和Grails的IntelliJ IDEA插件.这个插件是由JetBrains公司自己开发的,对于Groovy语言和Web框架都提供了无以伦 ...
- coding 除了托管外,还能进行团队协作.
coding 除了托管外,还能进行团队协作. oschina 也是非常不错的.
- UILabel iOS添加文本控件
UILabel这是iOS控制,这是UIView子类,只有在UIView文字显示功能的基础上加入.UILabel还查看课程和UIView类别似 //1.创建一个视图对象 //2.配置视图 ...
- 用XAML做网页!!—页头
原文:用XAML做网页!!-页头 接续上次进度,我们此次来制作页头. 首先要实现两侧边缘的美化,如下图所示: 在边缘处有一层朦胧的亮度反光效果,这也是通过简单的渐变实现的,而且我们在后面的每个区块中都 ...
- loading加载中效果
(function(){ try{ var ui={ loading:{ addCssStyle:function(text) { var head = document.getElementsByT ...
- 努比亚 Z5 mini刷机包 omni4.4.2改动V4.0 自用版 精简 MIUI特效
ROM介绍: 第一版: 1.基于lwang适配的omni4.4.2第二版改动,少量精简改动 2.设置加入"自启项管理",体验更快.更顺滑 3.替换特效为XUI特效 4.改动host ...
- 用JavaScript实现网页动态水印
1.基本原理 页面加载后,通过javascript创建页面元素div,并在div元素中创建文本节点,展示水印内容 设置div元素样式,将其zIndex设置一个较高的值,并设置透明度,实现浮在页面的水印 ...
- 整理QTP知识之1
以下说明由网络其他文章整合而成. 一.关于QTP的说明 QTP是目前市场上占有率最高的一款自动化测试工具,也是每一位测试工作者最想掌握的工具之一,也是目前流行的基于GUI的功能自动化测试工具之一. Q ...
- 用C设计,用C++编码
昨天晚上看到刘江的blog又补充了好几大段,今天早上又看到云风的人肉trackback,果然还是这种话题引人关注. 云风先是提了一下所谓C++带来的思想包袱(文言文曰“心智包袱”)问题,然 ...