P1750 出栈序列 贪心

  

题目描述

给定一个由n个元素构成的序列,你需要将其中的元素按顺序压入一个大小为c的栈并弹出。元素按它们的出栈顺序进行排列,会得到一个新的序列。我们知道,这样的序列会有很多种,请输出所有新序列中第一个元素最小的序列(若第一个元素最小的序列有多个,则令第二个尽可能小;若仍有多个,则令第三个最小,以此类推)。

输入输出格式

输入格式:

第一行,两个数n,c

第二行n个数,为序列中n个元素的值

输出格式:

输出n个数,为满足要求的序列。

输入输出样例

输入样例#1:  复制
6 3
5 2 3 8 7 4
输出样例#1:  复制
2 3 5 4 7 8


显然单调队列是错的
如 4 3
1 3 4 2

  • 此题思路其实很简单,所谓的贪心其实就是模拟,模拟一个滑动窗口 
#include<bits/stdc++.h>
using namespace std;
long long a[10005];
bool used[10005];
int main()
{
    long long n,c,i,j;
    scanf("%lld%lld",&n,&c);
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    long long l=1,r=c,k=n,minn,mi;
    while(k!=0)
    {
        minn=9999999999;
        for(i=l;i<=r;i++)
        {
            if(a[i]<minn&&used[i]==0) 
            {
                minn=a[i];
                mi=i;
            }
        }
        if(k==0) printf("%lld\n",minn);
        else printf("%lld ",minn);
        k--;
        used[mi]=1;
        long long z=0;
        for(j=mi-1;j>=1;j--)
        {
            if(used[j]==0)
            {
                l=j;
                z=1;
                break;
            }
        }
        if(r<n) r++;
        if(z==0) l++;
    }
    return 0;
}
View Code







猜你喜欢

转载自www.cnblogs.com/bxd123/p/10993484.html