poj 3617 Best Cow Line 解题报告

题目链接:http://poj.org/problem?id=3617

题目意思:给出一条长度为n的字符串S,目标是要构造一条字典序尽量小,长度为n的字符串T。构造的规则是,如果S的头部的字母 < S的尾部的字母,那么将S的头部的字母加入到T中,删除S的头部的字母;如果S的头部的字母 > S的尾部的字母,那么将S的尾部的字母加入到T中,删除S的尾部的字母。

   这个题目的关键是如何处理 S 的头部的字母(假设用 i 指示) = S的尾部的字母(j) 这种情况。此时需要比较 i+1 和 j-1 的位置的字母,如果相同,继续比较下去。

     

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 using namespace std;
 5 
 6 const int maxn = 2000 + 10;
 7 char s[maxn];
 8 
 9 int main()
10 {
11     int n, i, j, a, b, cnt;
12     while (scanf("%d", &n) != EOF)
13     {
14         for (i = 0; i < n; i++)
15         {
16             getchar();
17             scanf("%c", &s[i]);
18         }
19         cnt = 0;
20         i = 0, j = n-1;
21         while (i <= j)
22         {
23             if (s[i] < s[j] && i <= j)
24                 printf("%c", s[i++]);
25             else if (s[i] > s[j] && i <= j)
26                 printf("%c", s[j--]);
27             else
28             {
29                 a = i;
30                 b = j;
31                 while (s[i] == s[j] && i < j)
32                 {
33                     i++;
34                     j--;
35                 }
36                 if (s[i] <= s[j] || i == j)  // s[i] <= s[j] 不能写成s[i] < s[j],这是为了处理aaaaa这些情况,否则改了会输出a
37                 {
38                     printf("%c", s[a]);
39                     j = b;
40                     i = a+1;
41                 }
42                 else if (s[i] > s[j])
43                 {
44                     printf("%c", s[b]);
45                     i = a;
46                     j = b-1;
47                 }
48                 printf("a = %d, b = %d, i = %d, j = %d
", a, b, i, j);
49             }
50             cnt++;
51             if (cnt % 80 == 0)
52                 putchar('
');    
53         }
54     }
55     return 0;
56 }

  相反,别人写的,不需要考虑太多琐碎的情况

     

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 using namespace std;
 5 
 6 const int maxn = 2000 + 10;
 7 char s[maxn];
 8 
 9 int main()
10 {
11     int n, i, a, b;
12     while (scanf("%d", &n) != EOF)
13     {
14         for (i = 0; i < n; i++)
15         {
16             getchar();
17             scanf("%c", &s[i]);
18         }
19         int cnt = 0;
20         a = 0, b = n-1;
21         while (a <= b)
22         {
23             bool left = false;
24             for (i = 0; a + i <= b; i++)
25             {
26                 if (s[a+i] < s[b-i])
27                 {
28                     left = true;
29                     break;
30                 }
31                 else if (s[a+i] > s[b-i])
32                 {
33                     left = false;
34                     break;
35                 }
36             }
37             if (left)
38                 printf("%c", s[a++]);
39             else
40                 printf("%c", s[b--]);
41             cnt++;
42             if (cnt % 80 == 0)
43                 putchar('
');
44         }
45     }
46     return 0;
47 }

    

原文地址:https://www.cnblogs.com/windysai/p/3621833.html