NOIP2004 解题报告
第一题:
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。
解题过程:
送分题,模拟即可,但是要注意最后结算的时候除了存的钱,别忘记加上12个月累积下来没有花掉的钱;
15分钟左右一次AC;
第二题:
题目大意:给出n堆果子和各自的重量,要两两合并成一堆,合并的代价是两堆的重量和,求最小的总合并代价。
解题过程:
老题目,每次选取最小的两堆合并,直接循环找O(n^2)必定是超时的,因此可以用小根堆优化,但是手写堆有些麻烦。在建兰培训时提到过一种 更好的方法:
开两个队列,初始队列1为所有堆的重量,合并后的重量放到队列2里,每次取出两个队列队首小的那个的,重复一次,将两个值合并放到队列2里。
第三题:
题目大意:
让一个队伍尽可能少的人出队,使队伍排成以某个同学为最高,向左右递减。
解题过程:
直接分别从左到右,从右到左求以第i个人为结尾的最长上升子序列,在枚举i取最大值即可。时间复杂度O(n^2+n),或者用另外一种方法二分优化到(Onlogn+n);
第四题:(较难)
题目大意:给出N位的竖式加法,每一位都用字母表示,求出字母代表的数字;(输入数据保证唯一解)
解题过程:
一看便是搜索题,但n最大有26,直接枚举字母代表的数字要O(n!)的时间,要加适当的剪枝。
基本算法是回溯,记录字母代表的数字,和每个数字是否用过,从右往左处理每一列,如果碰到字母未确定,就枚举+dfs,并记录进位的情况,如果同一列有2个字母已经确定,那么可以直接计算另外一个,有冲突的话就回溯;
不加任何剪枝能过9个点,50分钟左右写完。
剪枝:由于题目数据保证只有唯一解,用一个flag记录是否已经找到答案,flag=1的时候就直接return;能过10个点。
优化1:枚举不确定的字母的值得时候,改为从n-1到0(原来是从0到n-1),这样效率要快得多,能过11个点,第12个点1100ms左右,就差一些。
然后就卡了N久,百度了半天感觉所有剪枝都用过了,结果卡在了1029ms,就是过不去。。。
最后抱着侥幸心理把string 改成了char数组,一提交居然600ms+AC了。难道取出char数组中的一个元素要比取出string中的一个元素快得多?百度了一下,可惜都没有说这个。八成是这样了。
被最后一个点恶心了2个小时。正道题估计3个小时才AC。
收获:
训练了耐心。。第一次写出5000B+的代码。。
DFS时循环变量从小到大改为从大到小可能会大大加速程序运行时间。
NOIP2004 解题报告的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- poj2420A Star not a Tree?(模拟退火)
链接 求某一点到其它点距离和最小,求这个和,这个点 为费马点. 做法:模拟退火 #include <iostream> #include<cstdio> #include< ...
- hdu4720Naive and Silly Muggles
链接 一直理解的最小覆盖圆就是外接圆..原来还要分钝角和锐角... 钝角的话就为最长边的中点,对于这题分别枚举一下外接圆以及中点的圆,判一下是不是在园外. #include <iostream& ...
- odoo中pos模块由于删除partner导致发生(你试图访问的单据已经删除)错误的解决方法
model.js文件中 push_order: function(order) { var self = this; if(order){ this.proxy.log('push_order',or ...
- zend studio12.5破解方法
其实,很简单,找到zend studio 安装目录,G:\zend studio\plugins,把文件com.zend.verifier_12.5.1.v20150514-2003.jar替换成压缩 ...
- Python学习笔记1—模块
模块的使用 引用模块的两种形式 形式一: import module_name 形式二: from module1 import module11 (module11是module的子模块) 例: ...
- zabbix监控系统客户端安装
原文:http://blog.chinaunix.net/uid-25266990-id-3387002.html 测试使用agentd监听获取数据. 服务端的安装可以查看http://blog.ch ...
- oracle中between
oracle中between and包含边界值,也就是所谓的闭区间. 如 between 1 and 100,则表示包含1和100及以内的一切数值. 如以下语句: 1 2 3 4 5 6 7 8 9 ...
- linux下tftp安装与设置
在学习linux+arm开发的时候,tftp和NFS是必不可少的环境.这里总结一下自己安装和使用tftp的一些经验,做个备忘. 一.tftp服务原理 tftp(trivial file transfe ...
- centos7 修改selinux 开机导致 faild to load SELinux policy freezing 错误
centos7 修改selinux 开机导致 faild to load SELinux policy freezing 错误 之前把selinux关闭了,这次想打开selinux,于是修改了 /e ...
- SAP MM事务代码清单