【贪心+一点小思路】Zoj - 3829 Known Notation
2015-08-09 17:14
218 查看
借用别人一句话,还以为是个高贵的dp... ...
一打眼一看是波兰式的题,有点懵还以为要用后缀表达式或者dp以下什么什么的,比赛后半阶段才开始仔细研究这题发现贪心就能搞,奈何读错题了!!交换的时候可以任意两个字符交换然而就那么看成了只能相邻的数字字符与'*'字符交换....../(ㄒoㄒ)/~~...但赛后补题的时候发现细节考虑的不好,还是应该锻炼下自己的逻辑整理...
怎么贪咧...
第一步,全数字串即合法,直接输出0即可;
第二步,数字不够的话要添。所谓数字够,即数字的个数至少要比星号个数多1,否则可以把缺少的数字(al+1-di)加在最开头,这样是最直接理想的。相应的,这也相当于增添操作的次数进行了(al+1-di)次;
第三步,在数字个数与星号个数都合法的条件下,不合法星号的位置要进行交换,交换策略是和该星号后的一个数字交换;这样的话就能保证每一个星号前是合法的,可能会有人对这一步不太理解:
for(int i = 0; i < len; i++) { if(str[i] == '*') ta++; else td++; if(td-ta<1) { td++; ta--; ans++; } }
因为所有数字个数与字符个数都已经是合法的了,所以大可以不必考虑交换的具体位置,保证星号前合法的交换总会合法的。
附代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> using namespace std; int main() { int T; cin >> T; while(T--) { string str; cin >> str; int len = str.length(); int al, di; al = di = 0; //初始串的数字个数与星号个数 for(int i = 0; i < len; i++) if(str[i] == '*') al++; if(al == 0) {printf("0\n"); continue;} di = len-al; int need; //是否缺少数字字符 if(di - al >= 1) need = 0; else need = al+1-di; int td, ta; td = need; ta = 0; int ans = need; for(int i = 0; i < len; i++) { if(str[i] == '*') ta++; else td++; if(td-ta<1) { td++; ta--; ans++; } } cout << ans << endl; } return 0; }View Code
相关文章推荐
- 【Java多线程】之十一:Java BlockingQueue Example implementing Producer Consumer Problem
- java list用法
- struts2.2 Annotation 注解配置Action
- Java的Package和Classpath
- STM32关于编译不通过,错误提示 Error: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o
- Scrollable-master的使用和改装
- html 学习1
- 视觉错觉(2)
- java.util.Date和java.sql.Date的区别及应用
- js高程3笔记
- 关于html5音频如何应用及解决方法?
- LeetCode #4 Median of Two Sorted Arrays
- 代理作用之二:代理回调(反向传值)
- 02_02 JSP内置对象之四种属性范围
- 【JavaMail开发总结】配置文件形式--发送邮件程序
- 重复子串问题(四):求两个字符串的最长公共字串
- 第一周学习日志
- 关于项目管理专业人士(PMP)认证考试5P的个人心得
- N年前Nginx负载均衡在新浪播客中的应用
- zoj 3204 Connect them(kruskal算法) 解题报告