问题试求至少用几个双端队列可排序
那么我们不妨换过来思考,将数列排好序后,再来找队列个数
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct my{ int x,id; }; const int maxn=200000+10; my a[maxn]; int Max[maxn],Min[maxn]; bool cmp(const my &c,const my &d){ if(c.x==d.x) return c.id<d.id; return c.x<d.x; } int main(){ int n; scanf("%d",&n); for (int i=1;i<=n;i++){ scanf("%d",&a[i].x); a[i].id=i; } int top=1; sort(a+1,a+1+n,cmp); Min[1]=a[1].id; a[0].id=a[1].id; for (int i=1;i<=n;i++){ if(a[i].x!=a[i-1].x||i==1){ Max[top]=a[i-1].id; Min[++top]=a[i].id; } } int ans=0,h=0x3f3f3f3f; bool b=0; for (int i=1;i<=top;i++){ if(!b){ if(Max[i]<h) h=Min[i]; else { h=Max[i]; b=1; } } else{ if(Min[i]>h) h=Max[i]; else{ ans++; b=0; h=Min[i]; } } } printf("%d\n",ans); return 0; }
本文探讨了使用最少数量的双端队列进行序列排序的问题,通过一种逆向思维策略,即先排序后确定所需队列数目,提出了一种有效的算法实现方案。该算法首先对输入序列进行排序,然后通过特定的比较和更新策略,确定能够容纳排序后的序列所需的最小双端队列数目。
&spm=1001.2101.3001.5002&articleId=101130783&d=1&t=3&u=353853ea95b347449552723a7974c2f1)

被折叠的 条评论
为什么被折叠?



