zoukankan      html  css  js  c++  java
  • P1886 滑动窗口 /【模板】单调队列

    题目描述

    有一个长为 n的序列 a,以及一个大小为 k 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

    例如:

    The array is ([1,3,−1,−3,5,3,6,7]), and (k = 3)

    img

    输入格式

    输入一共有两行,第一行有两个正整数 n,k。 第二行 n 个整数,表示序列 a[]

    输出格式

    输出共两行,第一行为每次窗口滑动的最小值
    第二行为每次窗口滑动的最大值

    输入输出样例

    输入 #1复制
    8 3
    1 3 -1 -3 5 3 6 7
    
    输出 #1复制
    -1 -3 -3 -3 3 3
    3 3 5 5 6 7
    

    说明/提示

    【数据范围】
    对于 50%50% 的数据,1 le n le 10^51≤n≤105;
    对于 100%100% 的数据,1le k le n le 10^61≤kn≤106,a_i in [-2{31},2{31})a**i​∈[−231,231)。

    代碼

    #include<stdio.h>
    
    int minmax(int a[],int low,int high,int judge){
    	int minNum=a[low];
    	int maxNum=a[low];
    	for(int i=low+1;i<high;i++){
    		if(a[i]>maxNum){
    			maxNum=a[i];
    		}
    		if(a[i]<minNum){
    			minNum=a[i];
    		}
    	}
    	if(judge==1){
    		return minNum;
    	}else{
    		return maxNum;
    	}
    }//返回數組特定區間内的最大最小值,1min 0max 
    
    int main(){
    	int n,k;
    	scanf("%d%d",&n,&k);
    	int a[n];
    	for(int i=0;i<n;i++){
    		scanf("%d",&a[i]);
    	}
    	
    	for(int i=0;i<n-k+1;i++){
    		printf("%d ",minmax(a,i,i+k,1));
    	} 
    	
    	printf("
    ");
    	
    	for(int i=0;i<n-k+1;i++){
    		printf("%d ",minmax(a,i,i+k,0));
    	} 
    	return 0;
    }
    
    

    此版本超時了。。。打算優化一下

    第二版代碼
    
    
  • 相关阅读:
    hxpCTF 2021 revvm Writeup
    微博自动化测试
    RosettaScripts学习笔记20211118
    amber进行分子动力学模拟水盒子和density需要注意的事项
    linux bash 字符串替换
    JQuery常用方法基础教程
    一些Js实现圆角的资料
    分享十个应用最广的Javascript框架
    .NET获取ACCESS自动编号列的一种方法(转)
    asp.net 底层资料
  • 原文地址:https://www.cnblogs.com/rrrrraulista/p/14224599.html
Copyright © 2011-2022 走看看