https://vjudge.net/problem/POJ-3617
问题描述
给定长度为N的字符串S,要构造一个长度为N的字符串T,起初T是一个空串,随后反复进行下列任意操作:
1.从S头部删一个字符加到T尾部
2.从S尾部删一个字符加到T尾部
构造出字典序尽量小的T
思路:
贪心。
前面后面比较,取小的字符放到新串前面。如果相同,就两边同时往中间靠,比较下一个字符。可以设一个位移变量控制。
坑。。点:一行最多80个字符
有一种情况,最后80个字符后面,输出两个回车,会ac,加一个判断,输出一个回车,也会ac。

#include<iostream> #include<stdio.h> using namespace std; int N; char s[2003]; void solve() { int cnt = 0,f = 0; int a = 0; int b = N - 1; //cout << a << b; while(a <= b){ //f = 0; bool left = false; ///设置一个偏移量 i for(int i = 0 ; a + i <= b;i++){ if(s[a + i] < s[b - i]){ left = true; break; }else if(s[a + i] > s[b - i]){ left = false; break; } } // cout << "hello" << endl; if(left) putchar(s[a++]); else putchar(s[b--]); cnt++; if(cnt == 80){ // f = 1; cout << endl; cnt = 0; } } //if(!f) putchar(' '); } int main() { cin >> N; //cout << N; int i = 0; for(int i = 0 ; i < N;i++){ cin >> s[i]; } // cout << s; solve(); return 0; }

#include<iostream> #include<stdio.h> using namespace std; int N; char s[2003]; void solve() { int cnt = 0,f = 0; int a = 0; int b = N - 1; //cout << a << b; while(a <= b){ f = 0; bool left = false; ///设置一个偏移量 i for(int i = 0 ; a + i <= b;i++){ if(s[a + i] < s[b - i]){ left = true; break; }else if(s[a + i] > s[b - i]){ left = false; break; } } // cout << "hello" << endl; if(left) putchar(s[a++]); else putchar(s[b--]); cnt++; if(cnt == 80){ f = 1; cout << endl; cnt = 0; } } if(!f) putchar(' '); } int main() { cin >> N; //cout << N; int i = 0; for(int i = 0 ; i < N;i++){ cin >> s[i]; } // cout << s; solve(); return 0; }