导航

POJ3617

Posted on 2018-02-27 17:28  Byyyyy  阅读(103)  评论(0)    收藏  举报

 

问题描述

给定长度为N的字符串S,要构造一个长度为N的字符串T,起初T是一个空串,随后反复进行下列任意操作:

1.从S头部删一个字符加到T尾部

2.从S尾部删一个字符加到T尾部

构造出字典序尽量小的T

思路

字典序的话,前面的字符越小,字典序也就越小,因此尝试让前面的字符尽可能小,有这样的贪心思路,不断从S头或尾取尽可能小的字符添加到T的尾部。

注意坑点:一定要匹配输入的一个空字符,否则也会算在字符串内

 

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 #define MAXN 2020
 6 char s[MAXN];
 7 int main(){
 8     int N;
 9     while(scanf("%d",&N)!=EOF){
10         for(int i=0;i<N;i++){
11             scanf(" %c",&s[i]);
12         }
13         int tag=0;
14         int l=0,r=N-1;
15         while(l<=r){
16             bool flag=false;
17             for(int i=0;l+i<=r;i++){
18                 if(s[l+i]<s[r-i]){
19                     flag=true;
20                     break;
21                 }else if(s[l+i]>s[r-i]){
22                     flag=false;
23                     break;
24                 }
25             }
26             if(flag)
27                 putchar(s[l++]);
28             else
29                 putchar(s[r--]);
30             tag++;
31             if(tag==80){
32                 printf("\n");
33                 tag=0;
34             }
35         }
36         printf("\n");
37     }
38     return 0;
39 }
View Code