POJ 3617 字典序最小问题
2015-09-05 10:50
211 查看
从字典序的性质来看,无论一个字符串末端有多大,只要前面的部分较小即可,所以可以用以下的贪心性质:
不断取字符串S的开头和末尾中较小的一个字符放到新的字符串T的末端。
既然是比较字符大小,那么就不能忽略字符相等的情况。
首先把字符串S反转得到字符串S’,按字典序比较S和S’,然后按以下三种情况处理:
1.S较小,从S的开头取出一个字符,加到T的末端
2.S’较小,从S’的开头取出一个字符,加到T的末端
3.S与S’相同,任取一个加到T的末端即可
这个就是它的贪心策略。
不断取字符串S的开头和末尾中较小的一个字符放到新的字符串T的末端。
既然是比较字符大小,那么就不能忽略字符相等的情况。
首先把字符串S反转得到字符串S’,按字典序比较S和S’,然后按以下三种情况处理:
1.S较小,从S的开头取出一个字符,加到T的末端
2.S’较小,从S’的开头取出一个字符,加到T的末端
3.S与S’相同,任取一个加到T的末端即可
这个就是它的贪心策略。
#include<cstdio> #define MAX 2002 char str[MAX]; char res[MAX]; main(){ int n; while(~scanf("%d",&n)){ getchar(); for(int i = 0;i < n;i++){ scanf("%c",&str[i]); getchar(); } int l = 0, r = n - 1, k = 0; str = 0; while(l < r){ if(str[l] < str[r]){ res[k] = str[l++]; } else if(str[l] > str[r]){ res[k] = str[r--]; } else{ int x = l + 1, y = r - 1; while(x < y && str[x] == str[y]){ x++; y--; } if(str[x] < str[y]){ res[k] = str[l++]; } else{ res[k] = str[r--]; } } k++; } res[n - 1] = str[l]; res = 0; int ans = 0; for(int i = 0;i < n;i++){ printf("%c",res[i]); ans++; if(ans % 80 == 0 && i < n - 1) printf("\n"); } } }
相关文章推荐
- A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C();
- STL内存管理(二)
- MySQL5.6安装步骤(windows7/8_64位)
- #1078 : 线段树的区间修改
- 在kali linux 上对普通用户的操作
- Py2exe打包时添加自定义库搜索目录
- Siebel_CRM
- R cannot be resolved to a variable 解决办法
- django-admin.py startproject 无法创建项目
- 2015省赛小结
- mysql的算术运算符和比较运算符
- R语言包_gbm
- ueditor样式过滤问题
- js 获取页面内容可见区域的高度和宽度
- 树状数组模版
- JAVA多线程和并发基础面试问答
- ZigZag Conversion
- 求解1-10000区间内的素数
- 对不起,我不是一个善良的人
- 揭秘AngularJS工作原理