贪心练习
题目大意:
给定长度为 $len$ 的字符串 $S$ ,要构造一个长度为 $N$ 的字符串 $T$ 。起初 $T$ 是一个空串, 随后反复进行如下操作:从 $S$ 的头部或者尾部删除一个字符加到 $T$ 的尾部, 构造一个字典序尽可能小的字符串 $T$
题解:
从字典序的性质, 无论 $T$ 的结尾有多大,只要前面部分尽可能小就可以。按照字典序比较 $S$ 和将 $S$ 反转后的字符串 $S'$, 如果 $S$ 较小, 从 $S$ 开头取文字追加到 $T$ 末尾 反之从 $S$ 末尾取出文字追加到 $T$ 末尾。字典序比较类的问题经常用得上贪心
样例:
ACDBCB
输出:
ABCBCD
代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; int len; char S[maxn]; void solve() { int a = 0, b = len - 1; while(a <= b) { bool left = false; 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; } } if(left) printf("%c", S[a ++]); else printf("%c", S[b --]); } printf(" "); } int main() { scanf("%s", S); len = strlen(S); solve(); return 0; }