一直没有敢发的NOIP2018游记

一直没有敢发的NOIP2018游记

NOIP2018游记

教练说知足是最好的,尽吾志而也不能及者,可以无悔矣。在这次考试中的表现令我还是十分满意的。(笑)

D1

T0

我配置背得感觉很好,我考场上直接默写出来了,没有什么困难。不过那个键盘我要吐槽一下,放在抽屉里面,特别蹩脚。(你感觉,你又说你感觉)

T1

这道题是原题,五分钟就写完了。就是一个很傻的贪心。不过当时在机房做做到这道题的时候,第一反应是写了一颗线段树然后贪心,后来仔细想一下,就按照直觉给写了一个几行的贪心,交上去过了。运气正好,但也许就是这一题运气好吧。

T2

这道题是我本次NOIP最可惜的一道题,没有之一。考场上我看到这道题,猜了一个结论,也不是猜测,就是证明了一个结论,就是说新的货币系统的组成部分一定是给定货币系统的子集。于是我们sort一遍,然后直接用线性筛素数的办法,看那个数可以直接被比它小的数表达出来就好了,筛一轮就可以出来了。复杂度,而且\(n\le100 ,m\le25000​\)写了几分钟就把大样例过了。

但是,为什么说很可惜呢?

众所周知,我的代码里总是有这样的代码。

const int maxn=105;
const int maxnum=25005;

在线性筛答案的时候,需要一个

bool in[maxnum];

来记录这个数字是否被筛出来了。显然,如果不加控制,会越界RE,所以:

sort(data+1,data+n+1);
for(int t=1;t<=n;t++){
    if(!in[data[t]])
        ans++,in[data[t]]=1,sav.push_back(data[t]);
    for(int i=0;i<sav.size();i++){
        if(data[t]+sav[i]>maxn)//注意这里
            continue;
        if(data[t]+sav[i]>data[n])
            continue;
        if(!in[data[t]+sav[i]])
            sav.push_back(data[t]+sav[i]);
        in[data[t]+sav[i]]=1;
    }
}

显然可以水过去。

但是!有没有细心的小伙伴发现,这一行代码有一点问题

if(data[t]+sav[i]>maxn)
    continue;

回顾我们上面那一行:

const int maxn=105;
const int maxnum=25005;

原来!!!!

(其实只需要下面那个对于data[n]的判断就好了)

想不到连续一个多月的考试,都没有暴露我自己代码风格不够直观的问题。机房的小伙伴老说看不懂我代码,然而我不以为意。想不到在NOIP上翻车了......

分数太容易拿,也太容易丢了。或许这就是信息学吧。

九点左右,前两道题就写完了。

T3

写了两个特殊性质,可以说很傻。第一个特殊性质输出一个直径,第二个特殊性质写一个贪心。成功写出40分,其实我写了所有情况的一个假DP做法,不过没拿一分。

D1: \(100+100+40=240 ->100+30+40=170\),有点烦躁。

D2

T0

什么也没发生。不过心疼坐我右边那个小朋友,他坐我旁边,以为我昨天AK了,很是羡慕..他好像第一天没有150吧...

T1

浏览完三道题后,觉得第一题好水,感觉全场能切,先写第一题。第一档我发现就是一个树上贪心,每次把自己所有儿子中最小的那个走了就好了。第二档多一条边,好办。我直接断开一条边就是一个原来的问题了。\(O(n^2)\)

不过今天的T1没有那么顺利。testdata4老是过不了。调了我接近两个小时,终于过样例了。

原来是我比对答案的时候出错了,应该在发现有不同时,判断,然后马上break。我一直没发现。还是我字符串不够熟练啊。所以外面混,迟早要还的。\(O(n^2)\)水过去了。

但是!!!后面测民间数据的时候,我只有88分,最后三个点TLE。我找到原因了,我使用的是链式前向星,所以要sort才能做到不然复杂度就是错的。

加到数组里面先缓存一下,然后再加到链式前向星里就完事了。

不过要乐观,下考后,发现大家居然都没想到直接断一条边做,还说这是一颗奇环树。我根本就没想过这个东西(乱搞主义好啊),没想到其实自己也能骚出这样的办法,233

还剩一个半小时,进入T2 T3。

T2

这道题我以为是组合数学......正好之前yyb讲过的矩阵中不同路线数量是,我以为直接这样能做,但是发现并不行。看到数据范围,发现,觉得是一个状压DP,不过想了一下,转移很复杂。时间不够了,我决定跳过T2,去做T3。写了一个输出样例的程序,走了(还得了很多分)。

T3

这两天好像都没写DP吧?这个一看是个树上DP啊!设表示在节点,有/无驻扎时,最小花费。的时候很好转移,呢?我直接这样:\(dp[i][0]=min(dp[i][1]-min(dp[k][1],dp[k][0])+cost[i])​\)

小样例过了,大样例呢?不行。点开样例,发现不可调试,于是我自己手写了一个样例,发现:

dp有后效性!

好吧,好吧,怎么找到一个合适的顺序,使得我可以忽视掉后效性呢?我想啊想,下考了。

\(100+13+24=127->96+13+26​\)

结语

NOIP2018 : 二等,知足了,毕竟我才学几个月不到呢,但是很遗憾,高一一等奖肯定有很多新的机会,然而我都只能错过了...

至此,我的NOIP2018就结束了。有惊喜,也有遗憾。惊喜的是,那些我原来觉得不可做的题目,终于可以在我的努力下,扣出一点分。遗憾的是,两道完全会的题目,都没有满分。But life carries on !

​ I don't know, where this road leads , but I know where to start. ----Via Martin

​ 不知道这条道路会通向何方,但我知道从哪开始。

​ Winlere ,16,Dec , noon.

回顾

要参加(观)省选的我看到NOIP的我,感觉自己真是naive啊...

dp有后效性这个东西直接上动态dp就完事了,我当时还很崩溃,不知道怎么办,因为写了太久了QAQ,不过菜菜的我居然能过看出来,也震惊。

1=都没有的最大原因就是落实不行,其实也不是我不去落实,当时实在是太弱了!其实当时我多问问,缠着随便一个dalao问问分治的原理是什么,甚至找谢总求教分治原理是什么,NOIP也不会怎么差,对于很多算法的真正理解就是那天突然领悟分治的含义,假如这个觉悟放在NOIP之前,可能NOIP的结果也不会这么糟吧。

posted @ 2019-04-03 22:40  谁是鸽王  阅读(185)  评论(0编辑  收藏  举报