zoukankan      html  css  js  c++  java
  • 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 }

        

  • 相关阅读:
    hdu 5918(强行水过去..正解KMP)
    hdu 5914(斐波拉契数列)
    hdu 5912(迭代+gcd)
    bzoj 2819(DFS序+树状数组+博弈+lca)
    BestCoder #88(1001 1002)
    hdu 5468(dfs序+容斥原理)
    hdu 5692(dfs序+线段树,好题)
    dfs序题目练习
    csu 1806 & csu 1742 (simpson公式+最短路)
    LuoGuP3774:[CTSC2017]最长上升子序列
  • 原文地址:https://www.cnblogs.com/windysai/p/3621833.html
Copyright © 2011-2022 走看看