【贪心】POJ - 3617 Best Cow Line
题意
给n个字母组成的串S,和一个空串T,给两种操作:删除S头部的字母加到T的尾部;删除S尾部的字母加到T的尾部,构造字典序最小的串T
思路
比较头部与尾部字母的大小,若头部小,则将头部字母加入T;若尾部小,则将尾部字母加入T;若两字母相同,则继续比较头部之后与尾部之前的字母,将先找到小字母的头部或尾部字母加入T
总结
贪心算法,找到合适的规则
scanf(" %c", &s[i]); 在%c前加一空格,可有效避免每行的回车符,因为输入时是每个字母一行,比getchar写起来简便
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 #include <utility> 7 const int maxn = 2000 + 5; 8 using namespace std; 9 int n, m; 10 char s[maxn]; 11 int main() 12 { 13 14 scanf(" %d", &n); 15 for(int i = 0; i < n; i++) { 16 scanf(" %c", &s[i]); 17 } 18 // printf("%s\n", s); 19 int a = 0, b = n-1; 20 bool flag = false; 21 int cnt = 0; 22 while(a <= b) { 23 for(int i = 0; i+a <= b; i++) { 24 if(s[a+i] < s[b-i]) { 25 flag = true; 26 break; 27 } 28 else if(s[b-i] < s[a+i]) { 29 flag = false; 30 break; 31 } 32 } 33 if(flag) putchar(s[a++]); 34 else putchar(s[b--]); 35 cnt++; 36 if(cnt % 80 == 0) 37 putchar('\n'); 38 } 39 40 return 0; 41 }