题目链接:POJ 3617
题意:给n个字符,如样例6个字符ACDBCB,从开头或者末尾选一个字符加到新字符串的末尾,使得到的新字符串字典序最小。
注意输出每行最多80个字符。
贪心,将原字符串与反转字符串比较来决定取哪里的字符串。
挑战程序设计竞赛2.2.3 字典序最小问题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[2010];
int main() {
int n;
while(~scanf("%d", &n)) {
getchar();
int i;
for(i = 0; i < n; i++) {
s[i] = getchar();
getchar();
}
int l = 0, r = n - 1;
int cnt = 0;
while(l <= r) {
cnt++;
bool left = false;
for(i = 0; l + i <= r; i++) {
if(s[l + i] < s[r - i]) {
left = true;
break;
}
else if(s[l + i] > s[r - i]){
left = false;
break;
}
}
if(cnt > 80) {
putchar('\n');
cnt = 1;
}
if(left) putchar(s[l++]);
else putchar(s[r--]);
}
putchar('\n');
}
return 0;
}

本文介绍了解决字典序最小问题的一种方法,通过比较原字符串及其反转字符串来确定如何构建新的字典序最小字符串,并确保输出每行不超过80个字符。
5574

被折叠的 条评论
为什么被折叠?



