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]); }