ZJNU 1365 - Window--中级

每次都寻找长度为k的区间内的最小值显然很容易超出时间限制

所以可以把窗户看作一个数量固定的队列

每次观察入列与出列的元素对答案贡献如何,以更新答案

#include<stdio.h>
int tmp[1000010],max[1000010];
int gmax(int i,int k)
{
    int j,m=tmp[i];
    for(j=i-1;j>i-k;j--)
        if(m<tmp[j])
            m=tmp[j];
    return m;
}
int gmin(int i,int k)
{
    int j,m=tmp[i];
    for(j=i-1;j>i-k;j--)
        if(m>tmp[j])
            m=tmp[j];
    return m;
}
int main()
{
    int n,k,i,lmin,lmax;
    scanf("%d%d",&n,&k);
    for(i=0;i<k;i++)
        scanf("%d",&tmp[i]);
    lmin=gmin(k-1,k);
    lmax=gmax(k-1,k);
    printf("%d",lmin);
    max[0]=lmax;
    for(;i<n;i++)
    {
        scanf("%d",&tmp[i]);
        if(tmp[i-k]==lmin)//如果即将移出的数字与前一位置的答案相同,说明答案需要重新查找
            lmin=gmin(i,k);
        else if(tmp[i]<lmin)//如果即将移入的数字比前面的答案小,更新答案为当前位置输入的答案
            lmin=tmp[i];
        printf(" %d",lmin);
        if(tmp[i-k]==lmax)
            lmax=gmax(i,k);
        else if(tmp[i]>lmax)
            lmax=tmp[i];
        max[i+1-k]=lmax;
    }
    printf("\n%d",max[0]);
    for(i=1;i<n-k+1;i++)
        printf(" %d",max[i]);
    
    return 0;
}

 

posted @ 2020-01-26 22:42  StelaYuri  阅读(114)  评论(0编辑  收藏  举报