题意大概是给n个不重复元素和一个空双端队列,要求按给出的顺序将这些元素插入队头或队尾,来保证最后得到的队列字典序最小。
思路就是贪心,刚开始用了数组纯暴力模拟的办法。
#include<bits/stdc++.h>
using namespace std;
#define N 200005
int main()
{
int t;
cin>>t;
while(t--)
{
int n,i,j;
int a[N];
cin>>n;
int last;
for(i=0;i<n;i++)
{
int b;
cin>>b;
if(!i)
{
a[0]=b;
last=b;
}
else
{
if(b>=last)
{
a[i]=b;
}
else
{
for(j=i;j>0;j--)
a[j]=a[j-1];
a[0]=b;
last=b;
}
}
}
for(i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl;
}
return 0;
}
然后快乐TLE
算了算最坏情况下会有O(n2)的复杂度,对于这道题是爆了。
遂百度大佬写法,换了双向队列,寄
#include<bits/stdc++.h>
using namespace std;
#define N 200005
deque <int>q;//建立一个双端队列
int a;
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n>>a;
q.push_front(a);//插入头部
for(int i=2;i<=n;i++)
{
cin>>a;
if(a<q.front()) q.push_front(a);//待入队元素小于队头元素则加至队头
else q.push_back(a);//否则加至队尾
}
while(q.size())
{
cout<<q.front()<<' ';//输出队头元素
q.pop_front();//弹出队头元素,让后面的元素成为队头
}
cout<<endl;
}
return 0;
}