POJ3617 - Best Cow Line
给定长度为N的字符串S,构造长度为N的字符串T,起初T是空串,反复从S的头部或者尾部删除一个字符,加到T的尾部。目标是构造字典序尽可能小的T。尝试如下贪心算法:
- 不断取S头部和尾部较小的字符放到T的尾部。
考虑S头部和尾部字符相同的情况。有如下算法:
- 按照字典序比较S和将S反转后的字符串S‘;
- 如果S较小,从S的头部取出一个字符添加到T尾部;
- 如果S‘较小,从S’的头部(即S的尾部)取出一个字符添加到T的尾部。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 int N; 6 char S[2100]; 7 8 void solve() 9 { 10 int left = 0, right = N-1; 11 bool left_flag = false; 12 13 int charnum = 1; 14 while (left <= right) 15 { 16 for (int i = 0; left+i <= right; i++) 17 { 18 if (S[left+i] < S[right-i]) 19 { 20 left_flag = true; 21 break; 22 } 23 else if (S[left+i] > S[right-i]) 24 { 25 left_flag = false; 26 break; 27 } 28 } 29 if (left_flag) 30 { 31 putchar(S[left++]); 32 if (charnum == 80) 33 { 34 putchar('\n'); 35 charnum = 0; 36 } 37 charnum++; 38 } 39 40 else 41 { 42 putchar(S[right--]); 43 if (charnum == 80) 44 { 45 putchar('\n'); 46 charnum = 0; 47 } 48 charnum++; 49 } 50 } 51 putchar('\n'); 52 } 53 54 int main() 55 { 56 cin >> N; 57 for (int i = 0; i < N; i++) 58 cin >> S[i]; 59 60 solve(); 61 62 return 0; 63 }