题目描述
众所周知,HYF有很多小姊妹。
HYF的小姊妹军团共有N个人,他每天选择一个不同的MM约会。现在HYF想把未来的N天里要约会的MM做一个计划……
首先,他按照自己的标准把N个MM分成A等~Z等,当然A等是质量最好的,Z等是质量最差的(可怜的Z等MM……),然后把她们随机地排成一个队列,比如ACDBCB。HYF决定每次选择队列最前或最后的MM约会,约过的MM就从队列中删去,这样就得到一个长度为N的约会序列。不同的选择方式会得到不同的约会序列,贪心的HYF当然希望先约质量高的MM啦!所以他希望得到所有约会序列中字典序最小的那个。
请你写一个程序帮他确定这样的约会序列。
HYF的小姊妹军团共有N个人,他每天选择一个不同的MM约会。现在HYF想把未来的N天里要约会的MM做一个计划……
首先,他按照自己的标准把N个MM分成A等~Z等,当然A等是质量最好的,Z等是质量最差的(可怜的Z等MM……),然后把她们随机地排成一个队列,比如ACDBCB。HYF决定每次选择队列最前或最后的MM约会,约过的MM就从队列中删去,这样就得到一个长度为N的约会序列。不同的选择方式会得到不同的约会序列,贪心的HYF当然希望先约质量高的MM啦!所以他希望得到所有约会序列中字典序最小的那个。
请你写一个程序帮他确定这样的约会序列。
输入
第一行一个正整数N,表示一共N个MM
接下来N行,每行一个大写字母,表示队列中第i个MM的级别
接下来N行,每行一个大写字母,表示队列中第i个MM的级别
输出
一行一个长度为N的字符串,表示约会序列中字典序最小的那个。
样例输入 Copy
6
A
C
D
B
C
B
样例输出 Copy
ABCBCD
提示
30%的数据,N<=20
60%的数据,N<=100
100%的数据,N<=2000
60%的数据,N<=100
100%的数据,N<=2000
这个题就是两边枚举,如果两边值一样大的时候(a[l]==a[r]),就在再判断(a[l+1]和a[r-1])
#include<iostream> #include<algorithm> using namespace std; const int maxn=1e6+100; char a[maxn]; int n; char b[maxn]; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } int l=1,r=n; int cnt=0; while(r>=l){ if(a[l]<a[r]){ b[++cnt]=a[l]; l++; } else if(a[l]>a[r]){ b[++cnt]=a[r]; r--; } else{ int flag=0; int ll=l+1,rr=r-1; while(rr>=ll){ if(a[ll]<a[rr]){ flag=1; break; } if(a[ll]>a[rr]){ flag=0; break; } ll++; rr--; } if(flag==0){ b[++cnt]=a[r]; r--; } else{ b[++cnt]=a[l]; l++; } } } for(int i=1;i<=n;i++){ cout<<b[i]; } }