问题 I: 约会序列(两边枚举)

问题 I: 约会序列

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

众所周知,HYF有很多小姊妹。
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的字符串,表示约会序列中字典序最小的那个。

样例输入 Copy

6
A
C
D
B
C
B

样例输出 Copy

ABCBCD

提示

30%的数据,N<=20
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];
    }
}

 

 
posted @ 2020-11-21 22:49  哎呦哎(iui)  阅读(158)  评论(0编辑  收藏  举报