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 }

 

posted @ 2014-09-30 17:29  bournet  阅读(397)  评论(0编辑  收藏  举报