知识点:贪心
在洛谷上面找到这道题了,惊叹它的难度竟然是4
这道题的关键在于当原字符串的开始和结尾字符一样的时候该选哪个,如果只考虑当前情况选哪个都没问题,但是会对下一个字符的选取产生影响,假设下两个字符就不一样了,如果一直一样怎么选都行,如果选了第一个,第二个字符串就露出来了,选最后一个同理,而且后面可能有连续的相同的字符,原始思路是去寻找后面第一个字符不相等的两个位置,这样做也行,就是程序会稍微复杂一点,况且问题在于我们两头向中遍历是确定第一次出现字符不等的时候是头这边的小还是尾那么边的小,并不需要求位置,只是要用这个结果,所以简便写法直接用字符串比较大小,用原来串和翻转后的串相比,哪个小就从哪头取,相等则随意
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
int main() {
int n;
cin >> n;
string t;
for (int i = 0; i < n; i++) {
char ch;
cin >> ch;
t += ch;
}
string s;
while (sz(t) > 1) {
char a = t[0];
char b = t[sz(t) - 1];
if (a < b) { s += a; t.erase(t.begin()); }
if (a > b) { s += b; t.erase(t.begin() + sz(t) - 1); }
if (a == b) {
string tt = t;
reverse(all(tt));
if (t <= tt) { s += a; t.erase(t.begin()); }
else { s += b; t.erase(t.begin() + sz(t) - 1); }
}
}
s += t;
for (int i = 0; i < sz(s); i++) {
cout << s[i];
if (i % 80 == 79) cout << endl;
}
return 0;
}