fjut 1871 获取敌情(贪心)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41117236/article/details/82023431

【题目】

获取敌情

TimeLimit:1000MS  MemoryLimit:128MB

64-bit integer IO format:%lld

Problem Description

在公元4484年,人类展开了对外界星球的征途和探索,但也不可避免的展开了和外星人之间的战争。偶然的机遇之下,美国联邦调查局截获了一串来自外星球的信息。但不知道有什么特殊的意义。所以就委托你,人类世界仅存的Acmer来破解这串神秘的信息。

所截获这条信息是长度为N的字符串Str,要重新组合成一个长度同样为N的字符串Ttr。Ttr一开始是一个空串。
重新组合的规则如为:每次从Str的字符串的头部或者尾部去除一个字符,并且接到Ttr的尾部。重复操作,直到Str为空串,Ttr为长度为N的字符串。

破解这条信息的关键在于要构造字典序尽可能小的字符串。
字典序:是指从前到后比较两个字符串大小的方法。首先比较第一个字符。如果不同则第一个字符较小的字符串更小,如果相同继续比较第二个字符串,来比较整个字符串的大小。

	加油吧,聪明的Acmer,拯救人类的重担就靠你们了

Input

输入包含多组样例。
首先输入整数N(1<=N<=1000)
然后输入字符串Str(仅含有大写字母)

Output

对于每一组测试案例,在每一行输出破解后的字符串Ttr。

SampleInput

6 
ACDBCB 
6 
DDABDD 
6 
DDBADD 

SampleOutput

ABCBCD 
DDABDD 
DDABDD 

【题解】

需考虑相等的时候优先选择哪一边。

扫描二维码关注公众号,回复: 3430284 查看本文章

【代码】

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
main()
{
    int n,l,r;
    string a;
    while(cin>>n)
    {
        cin>>a;
        l=0,r=n-1;
        while(l<r)
        {
            if(a[l]<a[r]) cout<<a[l],l++;
            else if(a[l]>a[r]) cout<<a[r],r--;
            else
            {
                int x=l+1,y=r-1;
                while(a[x]==a[y]&&x<y)
                {
                    x++,y--;
                }
                if(a[x]<a[y])
                    cout<<a[l++];
                else
                    cout<<a[r--];
            }
        }
        cout<<a[l]<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/82023431