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,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- (三)ubuntu学习前传—uboot常见环境变量
1.环境变量如何参与程序运行(1)环境变量有2份,一份在Flash中,另一份在DDR中.uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR ...
- js 高程(三)学习感言(随时更新)
1.读第二遍了,感觉第一遍白读了. 2.现在还处于初学...
- Android dex分包方案
当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时 ...
- junit4 javaee 5.0 jpa SSH 单元测试问题集锦
本篇文章基于已经实现了ssh集成的demo.项目.具体的ssh项目怎么配置,请参考本文最后 spring环境下的JUnit4测试 1,下载所需jar包: spring-test-3.2.0.RELEA ...
- J2EE 第二阶段项目之编写代码(六)
三张表的增 修改 查看.明天可以完成. 周末继续统计.
- mysql连接字符串
MySQL中 concat 函数使用方法:CONCAT(str1,str2,…)
- C# Socket编程(3)编码和解码
在网络通信中,很多情况下:比如说QQ聊天,通讯双方直接传递的都是字符信息.但是字符信息并不能够直接通过网络传输,这些字符集必须先转换成一个字节序列后才能够在网络中传输,于是这里就产生了编码和解码的概念 ...
- android,JNI创建进程,使用fork()
long add(long x,long y) { pid_t fpid; //fpid表示fork函数返回的值 int count=0; fpid=fork(); if (fpid < 0) ...
- jstree级联查找树
<script > obj=$.jstree.reference($('#plugins4')); function PP(obj,e,filename){ if (obj.get_par ...
- CLGeocoder Error Domain=kCLErrorDomain Code=2
使用CLGeocoder解码地址时,遇到错误 Error Domain=kCLErrorDomain Code=2 代码: #pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定 ...