题目链接: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\n", a, b, i, j); 49 } 50 cnt++; 51 if (cnt % 80 == 0) 52 putchar(‘\n‘); 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(‘\n‘); 44 } 45 } 46 return 0; 47 }
poj 3617 Best Cow Line 解题报告,布布扣,bubuko.com
原文:http://www.cnblogs.com/windysai/p/3621833.html