2021年度训练联盟热身训练赛第一场 E Early Orders

https://ac.nowcoder.com/acm/contest/12606/E

 

在贪心的基础上运用类似于单调栈的思想

从前往后考虑每个数

假设当前的答案序列为ans[]

考虑极端情况下有无数个数,那么只要现在的数比答案序列的最后一个更小,那么把答案序列的最后一个换成现在的数会更优

当答案序列中的数x已经是最后一个x的时候,x就不能再删去了

 

#include<cstdio>

using namespace std;

#define N 200001 

int sum[N],a[N],ans[N]; 
bool vis[N];

int main()
{
    int n,k,x;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;++i) 
    {
        scanf("%d",&a[i]);
        sum[a[i]]++;
    }
    int m=0;
    for(int i=1;i<=n;++i)
    {
        sum[a[i]]--;
        if(vis[a[i]]) continue;
        while(m && ans[m]>a[i] && sum[ans[m]]) vis[ans[m--]]=false;
        ans[++m]=a[i]; 
        vis[a[i]]=true;
    }
    for(int i=1;i<=k;++i) printf("%d ",ans[i]);
}

 

posted @ 2021-03-11 16:18  TRTTG  阅读(101)  评论(0编辑  收藏  举报