前行记录 - NOIP2018游记

NOIP2018游记 - 前行记录

NOIP2018 完跪……滚回学校考半期 QwQ

这篇不是题解 awa ,题解之后会发布的,毕竟我还没有AC呢

又及……G2020 陌路笙歌 - 再见(╯▽╰)


 

感悟

第一次考提高组,之前和将要AFO的G2020一起培训了很久,感触颇深~毕竟距离AFO就只剩两年了,还是抓紧吧

星期五试机的时候有一点爆炸……O(nlogn) 的最长上升子序列都写挂了。

考试的时候根据策略先扫了一遍所有的题——嗯~好!没几道会做的 QwQ


 

Day1 划水

一群人说AK Day1……然后高中那边说只有3个人没AK,然而真的很爆炸

铺设道路

一开始的奇葩思路:找到最小值,作为分隔点分治;

怎么找最小点呢?线段树!-_-|||

然后发现好像很难实现……如果区间里有多个最小值怎么办?

又一想,NOIP day1 t1 线段树??? Impossible! 

再看一眼……贪心!尽可能多填(似乎是很明显的)!单调栈!(终于对了)

嗯,用了1h做出来

货币系统(对,就是这道题写挂了)

好熟悉的题目……完全背包!(正解是这样)

然后莫名递推式写挂,多写了一个 O(n)

出题人非常友好~特殊数据挺多。

先说我自己的做法吧……因为时间不够,就没有写正解,直接骗分:

当m=1时直接跑DFS,加一个最优性剪枝;

当i和i+1相邻时,就相当于是一个链,所以可以二分答案,贪心检测(即从链的端点出发,尽可能选线段,记录现在的线段总长为tot,当tot>mid即符合条件时,就可以清零tot,找到的路径条数+1)

其实想到二分+贪心判断就已经接近正解了,还是有一点可惜。据说正解先二分答案,然后从叶子节点出发尽可能取线段(边),当达到mid时就形成了一条新的路径;当两个路径会于同一个节点,即LCA,则判断两条路径相连能否>=mid,可以就形成新路径,否则取较长的路径连接根节点再往上推。

 

听说很水,但是还是挂了;似乎是230的分。


 

Day2 尝试

好像有一点Difficult,对于一个初中生真是太不友好了(似乎对于zjx和tly巨佬来说不是这样的……)

旅行

比较简单的贪心;

从1出发;

对于树形结构先走较小点;

然后又一个环的情况挂了……时间复杂度没分析对,本来 O(n^2)能过,但是就没写,以为会 TLE;

填数游戏

看题目的时候第一眼——结论题!!!

然后第一题放弃后就开始死推结论,然后推出来一个似乎是正确的结论——

如果A,B两个位置,A在B的右上方,则A的填的数字不能大于B;

验证了一下2*2的情况,是对的(开心);然后手算3*3……为什么我算出来是144?!

心态就崩了……最后只好将6*6的所有答案通过DFS打表跑出来(效果不错)

然后赛后发现很多同学和我的结论一样……都卡住了,于是我们开始讨论——我把我有点疑惑的一点画出了图:

上面黑色块填的数字是1,看得出来蓝色路径为 "RDDDR",红色路径为"DRRRD",但是蓝色路径经过的点为"01010",红色路径经过的点为"01000"……

尴尬……结论完全错误

保卫王国

 第一眼树形DP(开心)

然后发现多组询问,沉思QwQ

想不出来,就只好写 O(n,m) 的,也就是对于每一次询问都做一次 O(n) 的DP

but……树形DP写挂了啊——因为如果当前点是询问中要求必须选/不选的点,dp状态中的一个值就需要赋值为INF,但是我把这一步操作放在了访问当前节点的儿子时处理的……也就是说如果当前节点是被限制的一个节点,在访问它的一个合法儿子(不是父亲)时,我就把某一个dp状态设为INF(比如当点u不能选时,表示“选择u点”的状态就是INF)。但是会出现一个问题——限制叶子节点时,因为叶子节点没有子节点,所以它的不合法状态就不会标记为INF,就挂了。

关键是只要存在一个这样的询问,整个数据就会挂掉QwQ


 

叹息

唉,以前常喜欢说 “路还很长,要慢慢走” ,但现在看来路虽长,但时间却不多了啊!

已经初三了,下一年就是高一,再过两年,没进省队就要AFO了(虽然不是真正的OIer,但是还是不愿提到AFO这个终会到来的事实)

后面的路得加紧走了(我设立了一个计划,刷《挑战程序设计竞赛》的习题,尽可能每周6道)

希望大家能共同进步(膜谁也没用,考场上还是孤单一人)


 

The End

Thanks for reading!

转载于:https://www.cnblogs.com/LuckyGlass-blog/p/9946014.html

NOIP 2018 普及组初赛第1028题的题解如下: 题目描述: 给定一个正整数N,要求编写一个程序,计算出它的阶乘N!。阶乘N!是所有小于或等于N的正整数的乘积,且0!定义为1。例如:5! = 5 × 4 × 3 × 2 × 1 = 120。 输入描述: 输入仅包含一个正整数N,其范围为1到20。 输出描述: 输出为计算得到的阶乘N!的值。 解题思路: 1. 使用一个数组来存储中间计算结果。 2. 从1开始,依次计算到N的所有整数的阶乘。 3. 每计算出一个数的阶乘,就将其乘到数组中,更新数组的值。 4. 最终数组存储的就是N!的结果。 注意点: - 由于N的范围为1到20,而20!的结果是一个非常大的数,普通的数据类型无法存储,因此需要使用数组来模拟大数运算。 - 在实现大数乘法时,需要注意进位的问题。 以下是一个简化的伪代码示例: ``` 输入:N 创建一个足够大的数组result用于存储结果 result[0] = 1 // 初始化结果为1 对于i从1到N: carry = 0 // 进位初始化为0 对于j从0到result的长度减1: temp = result[j] * i + carry result[j] = temp % 10 // 更新当前位的值 carry = temp / 10 // 计算新的进位 结束循环 如果carry不为0,则继续添加进位 结束循环 输出result数组(从后往前输出,以得到正确的顺序) ``` 实际编程时,需要注意数组的索引处理和进位处理,以及在输出时避免在前面输出不必要的零。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值