水题一个,直接贪心。当心有坑。
解题思路
设两个指针,分别指向队首和队尾,直接比较大小,取较小者放入队列b;
如果两个元素相等,就向中间靠(这时候要换两个变量,毕竟只能算是中间过程),直到找到对应不等的元素或者l>r(没有会TLE),哪一个小,就把对应的队首或队尾放进b里(注意放进去的还是原指针指向的元素!!!),continue。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
char a[30005],b[30005];
int main()
{
// freopen("bclgood.in","r",stdin);
// freopen("bclgood.out","w",stdout);
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
cin>>a[i];
int t=1,w=n,cnt=0,l,r;
while (t<w)
{
if (a[t]<a[w])
{
cnt++;
b[cnt]=a[t];
t++;
continue;
}
if (a[w]<a[t])
{
cnt++;
b[cnt]=a[w];
w--;
continue;
}
if (a[t]==a[w])
{
int l=t,r=w;
while (a[l]==a[r]&&l<r)
{
l++;
r--;
}
if (a[l]<=a[r])
{
<span style="white-space:pre"> </span>cnt++;
<span style="white-space:pre"> </span>b[cnt]=a[t];
<span style="white-space:pre"> </span>t++;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>else
{
cnt++;
b[cnt]=a[w];
w--;
}
}
}
if (cnt<n) b[n]=a[t];
for (int i=1;i<=n;i++)
{
cout<<b[i];
if (i%80==0) printf("\n");
}
return 0;
}