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,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- mysql delimiter
默认情况下,mysql遇到分号; 就认为是一个命令的终止符, 就会执行命令.而有些时候,我们不希望这样,比如存储过程中包含多个语句,这些语句以分号分割,我们希望这些语句作为一个命令,一起执行,怎么解决 ...
- mysql 主主复制的配置流程
1.先关闭B,把A的数据导出来,mysqldump -hlocalhost -uroot -p123456 --database ibprpu >ibprpu.sql2.关闭A,启动B,进入my ...
- CentOS用yum快速安装nginx
增加nginx源 vim /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/ ...
- Handler知识点详解
Handler是在多线程之间使用的,用于线程之间进行通信. 要想知道为什么需要Handler就首先说明android的主线程和工作线程. 主线程又称为UI线程.正是因为在android中,所有与UI有 ...
- Android5.0新控件CardView的介绍和使用
CardView也是5.0的新控件,这控件其实就是一个卡片啦,当然我们自己也完全可以定义这样一个卡片,从现在的微博等社App中可以看到各式各样的自定义卡片,所以这个控件意义不是很大.suppor ...
- Android ViewPager刷新解析
ViewPager刷新解析 原本以为PagerAdapter类似于BaseAdapter 但是使用起来发现刷新还是有区别的 解析如下 先上Demo PagerAdapter的四大函数 getCount ...
- 转:c++类实例在内存中的分配
转自:http://blog.csdn.net/alexwei2009/article/details/6157926 c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由 ...
- PHP获取某年第几周的开始日期和结束日期
http://blog.csdn.net/qq_27080247/article/details/50835956 /** * 获取某年第几周的开始日期和结束日期 * @param int $year ...
- Octave入门
Octave/Matlab Tutorial Octave/Matlab Tutorial Basic Operations 你现在已经掌握不少机器学习知识了 在这段视频中 我将教你一种编程语言 Oc ...
- ODS浅谈
ODS和DW 根据Bill.Inmon的定义,“数据仓库是面向主题的.集成的.稳定的.随时间变化的,主要用于决策支持的数据库系统” : ODS (Operational Data Store)操作型 ...