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]);
}
作者:xxy
本文版权归作者和博客园共有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/14518700.html