[wikioi2069]油画(贪心)
题目:http://www.wikioi.com/problem/2069/
分析:
首先这个问题比较复杂,涉及到两个重要的考虑点,一个是当前拿来的颜色是否保留,一个是若保留后那么应该把当前盘子的哪个颜色去掉。
先从简单考虑,假设不考虑当前颜色是否保留,规定如果盘子里没有的颜色拿来后就必须放入盘子中,同时从盘子中去掉一个颜色,那么问题就是现在删除哪个颜色好:
最直接的想法就是删去在后面出现次数最少的颜色,因为后面出现次数越多我把保留在盘子里就需要换更少次。那么这么想正确吗?
举个栗子:盘子里的颜色是1 2 3 给出的序列是4 1 1 4 2 2 2 3 3 3 3
那么根据我们的贪心策略盘子的颜色依次是:
4 2 3(+1)
1 2 3(+1)
1 2 3
4 2 3(+1)
……(后面没有了)
总共是3次
而如果我们第一次删的不是1而是3,则只需2次
这是因为"1"“迫在眉睫”,仔细想想,即使一个颜色在后面出现的次数再多再多,但在后面第一次出现的位置离现在位置很远很远,为什么要一直让它占着位置呢?
于是我们的贪心策略就是每次删除的盘子中所有颜色中在后面最晚出现(指第一次出现最晚)的颜色!
再加上另一个问题,就是考虑当前拿来的颜色是否要跟盘子中的换,这很好解决,我们可以理解成盘子容纳的颜色数变成了m+1个,我们将这个颜色放进去,然后再m+1个颜色中取按照第一问的原则删除最晚出现(第一次出现最晚)的颜色
综上,我们的贪心策略是:
对于当前处理颜色:
①盘子里有:直接跳过
②盘子里没有:
(1)若盘子里的所有颜色中最晚出现的颜色的位置比当前处理颜色紧接着的下一个位置要靠前,那么就不用把处理的颜色加入盘子中
(2)…………………………………………………………………………………………………………………………要靠后,那么就去掉最晚出现的颜色并把新颜色加入盘子
对于上面这个过程,当然用堆维护,鉴于要快速知道一个颜色的下一个位置,所以要用链表预处理
最新文章
- WinXP/Win7/Win8本地用户配置文件迁移至域用户
- PAT 1037. 在霍格沃茨找零钱(20)
- Web程序员常见的5个错误及解决方案
- angular.js中插值语法和ng-bind以及ng-model的区别
- wget: unable to resolve host address的解决方法
- tableviewCell折叠状态3
- What do data scientist do?
- SQL Server 2008 2005删除或压缩数据库日志的方法
- HDU1556(树状数组)
- 每周分享五个 PyCharm 使用技巧(二)
- 使用Bootstrap Bar来增加Onboarding Progress Bar功能。
- python学习笔记---环境的安装,pip命令,数据类型,运算
- google 插件
- rails 杂记 - render and layout
- 阅读程序 回答问题——FindTheNumber
- springMVC将处理的后的数据通过post方法传给页面时,可能会出现乱码问题,下面提出解决post乱码问题的方法
- MySQL根据表字段生成C#Model语句
- \n\r 转义字符
- MUI框架-06-静态页制作(图片轮播)
- sed使用
热门文章
- hdu 2255 奔小康赚大钱--KM算法模板
- C++ sort函数
- 令人哭笑不得的org.hibernate.MappingException: Unknown entity
- 标准IO的缓冲问题
- 在VMware上安装CentOS-6.5 minimal - 配置网络
- Luke 6:43-45
- selenium如何解决IE自动填充表单问题
- bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
- 怎么通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端?
- [转]Rapid Reporter——轻量级ET测试记录工具