博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2823 Sliding Window【双端队列】
阅读量:5253 次
发布时间:2019-06-14

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

求连续的k个中最大最小值,k是滑动的,每次滑动一个

用双端队列维护可能的答案值

假设要求最小值,则维护一个单调递增的序列

对一開始的前k个,新增加的假设比队尾的小。则弹出队尾的,直到新增加的比队尾大。增加队尾

从第k+1个到最后一个,依照上述规则,压入新数,然后弹出队首元素(满足队首元素相应原来序列的位置必须在视窗内。否则,继续弹出下一个)

#include 
#include
#include
#include
#include
#include
using namespace std;inline void put(int x){ if(x< 0){ putchar('-'); x = -x; } if(x == 0){ putchar('0'); return; } char s[20]; int bas = 0; for(;x;x/=10)s[bas++] = x%10+'0'; for(;bas--;)putchar(s[bas]); return;}int n,k;int num[1111111];int ansmin[1111111];int pj;int ansmax[1111111];int pjj;struct node{ int p,v;}q[1111111];int main(){ #ifndef ONLINE_JUDGE freopen("G:/1.txt","r",stdin); freopen("G:/2.txt","w",stdout); #endif scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&num[i]); } int start=1,tail=1; for(int i=1;i<=n;i++) { if(i==1) { q[1].v=num[1]; q[1].p=1; }// for(int j=tail;j>=start;j--)//弹出比它大的数// {// if(q[j].v>num[i])// tail--;// } while(tail>=start&&q[tail].v>num[i]) tail--; q[++tail].v=num[i]; q[tail].p=i;//将该数加到尾巴 //開始输出最小值 if(i>=k) { while(i-q[start].p>k-1) start++; ansmin[pj++]=q[start].v; } } start=1;tail=1; for(int i=1;i<=n;i++) { if(i==1) { q[1].v=num[1]; q[1].p=1; }// for(int j=tail;j>=start;j--)//弹出比它小的数// {// if(q[j].v
=start&&q[tail].v
=k) { while(i-q[start].p>k-1) start++; ansmax[pjj++]=q[start].v; } } for(int i=0;i

 

转载于:https://www.cnblogs.com/jhcelue/p/6991294.html

你可能感兴趣的文章
UVALive - 6571 It Can Be Arranged 最大流
查看>>
Javascript学习笔记(二)在HTML中使用Javascript
查看>>
完全背包
查看>>
Cookie、 LocalStorage 与 SessionStorage详解
查看>>
Thuwc2018 游记
查看>>
R语言输入与输出
查看>>
国土档案管理信息系统【档案著录】-他项权利类档案著录
查看>>
P3366 【模板】最小生成树
查看>>
一个屌丝程序猿的人生(六十九)
查看>>
(二)代理模式详解(包含原理详解)
查看>>
webgame(php+flex) 的优化方案。
查看>>
Xamarin Studio –Project not built in active configuration
查看>>
Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论
查看>>
Pandas模块
查看>>
为程序申请管理员权限
查看>>
day6——is,==,编码和解码
查看>>
mybatis学习(三)——接口式编程
查看>>
Leetcode 74 Search a 2D matrix
查看>>
JDBC工具类创建及使用
查看>>
特征归一化的方法 线性归一化 零均值归一化
查看>>