NOIP 2017 赛前集训总结 C++版

23 篇文章 0 订阅

ps:csdn莫名其妙吞我制表符和空格,若看着不爽,,忍着吧


愉(坑)快(爹)的十月总算撑过去了(感觉身体被掏空。。),,老衲终于从一个蒟蒻变成了另一个蒟蒻(没什么不对的。。),,回忆去年愉(悲)快(伤)的NOIP经历,,,(怎么办,感觉又要挂了),,我们来总结一发惨痛的经验教训,,。


(在说正文之前我想先来一个*蛤蛤蛤*的笑容)







好好学蛤,延年益寿。



——————————————————————————————


·根据大家多年NOIP经验,对于很多同学们来说题目难度与题目顺序貌似并没有太大关系。。。(这TM就是你T1爆0的原因嚒?)。如果T1太难了,这个时候,不要犹豫,果断的去(骂)做(出)T(题)2(人),,说不定后面的题会是一道超级大水(难)题呢,以我们高超的智商,,一定会AK(WA)微笑


·虽然说考试时间比较长(和文化课的考试比起),但相信大家总会感觉自己被长者关怀了,,刚想完暴力,旁边的大佬都把T3给AK了,,,所以考场策略很重要,,说不定良心出题人会给送分点呢(良心凯爷万岁!)。。最后半个小时,就不要老想着搞个大新闻去AK T3,一定会被评测姬批判一番的。检查cena配置,检查文件名,以及代码中有没有什么低级错误(高级错误你就算发现也来不及了。。)。。然后,听(去)天(玩)由(扫)命(雷)吧。。


·不要老想着搞个高大上的STL容器,然后把题水过去,,,好歹给用Pascal的小朋友们留一点生存空间嘛。。。vector, map, set, list, queue, stack什么的搞搞暴力或者用来对拍就行了。但是你企图靠它们来AK,那就一定要好好优化一番,下面讲讲这些年来总结的C++的暴力优化技巧,以及一些注意事项,让你的程序跑得比香港记者还快


——vector

不开O2真心慢,所以能少调用里面的东东就尽量少用;

比如我们可以将如下代码修改一下:

//vector <int> v;
for (int i = 0; i < v.size(); ++i) //...
访问.size()是很烧时间的,不妨改成:

//vector <int> v;
for (int i = v.size() - 1; i >= 0; --i)

另外,如果用vector充当一些不好确定大小的数组,建议放弃这种方法,改用数组,空间一定计算好,因为就算数据很多,vector 也会超时的。







——queue

一定注意当队列为空是不可以进行 .pop()操作的!先用 .empty()判断一发;如果你觉得你有强大的代码能力可以用try...catch 来 debug。

另外,STL库里的queue是不带指针的(这个我不确定蛤),更高级的queue如下:

#include <ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;

对于priority_queue,如果排序一些很高大上(如结构体)的东东,一定要operator排序方式哦!否则编译报错会很难看的。。。








——map & set

同样基于RBtree的高级操作,虽然不开O2简直慢到爆炸,但map 和 set 让我们的查找操作方便了许多,同样若我们要把key设为一些奇妙的东东,operator必不可少,否则编译报错会更难看的。。。









——迭代器 & 指针

指针是 C 的一大特色,当然,指针用起来也很妙妙,一旦搞拐了,,蛤蛤蛤蛤,,,

为什么zgs不给我们安利一波指针的用法啊,还得我自己写。。

算啦,懒得写,自行百度吧。。。这里只将一下重点

::iterator 并不适用于所有STL容器,而且具体使用方式也不同,

首先,我们来一波代码:

vector <int> :: iterator it = v.begin() + 1
set <int> :: iterator it = s.begin() + 1
如果我们编译以下,会发现第二句会报错,对迭代器指针位置任意加加减减,对于set等树形结构是不可以的,如果你有足够强的operator技巧请无视。。。

而反向迭代器的首尾是.rbegin() 和 .rend(),虽然是反向迭代,但按顺序遍历还是得++;
注意 .end() 和 .rend() 指向的是数组外,遍历时靠 it != X.end() 终止,否则,,蛤蛤蛤蛤。。









——#include <algorithm>

算法库有很多很多的好东西,比如 sort, unique等等(Pascal学子内心几乎是崩溃的。。),而且有一些疑似math库里的东东,却莫名其妙出现在算法库。。嗯。。记得using namespace std;。。好好学习里面的玄学吧,说不定能骗很多很多分呢。。








——三目运算符

三目运算符提供了快捷的判断途径,但显而易见,三目里面是不可以加入关键字操作的,而这里我不得不分享一下我使用三目时发生过的灵异事件。。:

(/*条件*/) ? (/*语句A*/, /*语句B*/) : (/*语句C*/, /*语句D*/); 

在三目中掺入多句操作,然后。。。当条件为true时,,,神奇的电脑执行了语句A和D??!!WTF!!

具体事故原因不详,,下次一定要小心谨慎。

灵异事件2:

X = (/*条件*/) ? A : B;
本来毫无违和感的一句,但如果条件中出现了and、or、xor,那么你就有机会再次碰上灵异事件了。。。








——#pragma warning(disable : )

disable理论上可以屏蔽一些警告,但是。。。DEV编辑器警告时并不会主动告诉你警告的编号,,那还disable个毛啊!!

而且,,我在虚拟姬上加上disable后发现然并卵。。托出去批判一番!!!








——struct
结构体让我们不用在数组间看花眼。,,然而,一件非常重要的事:struct在构造时会有一种叫对齐的操作,,这直接影响到了struct的空间大小(别指望可以用计算器按出它的大小),合理安排数据类型,实在不懂就用sizeof()试试吧。。










——字符串string 和 char*
string的本质是const char*,所以在传参时一定注意不要与char*混淆,否则,,warning/error会很难看的,。读字符串就不要作死用gets()(sei发明的?拖出去-1s!)了,,万一真的就..bomb!!!..了...蛤蛤蛤蛤
另外,对于字符串处理题,不要掉以轻心,严格按照题目要求,,千万不要偷懒省事,判断每一种可能出现的情况,多打 if 多保命。(勇士们可以尝试一下NOIP2003的侦探推理,一定注意防坑!)


(不不不,我不是二次元,我是正宗四次元(也就是比三次元还三次元),我说我放图是为了显得字数多一点你们信嚒)







//第一次补充版
#ifndef addition#1

#define addition#1

——SPFA
lcr大佬说过:有良心的出题人不会卡SPFA,出题人一般没良心。。
嗯,,如果没有负权值,还是用Dijkstra吧,,请把SPFA复杂度默认为O(N * M)


//我真没图啦啊啊(其实那些图也是来自我的二次元同学)


——数论
如果不会千万不要干瞪眼,,在草稿纸上多推一会,或者打暴力查看中间数据,,说不定你就可以发现一些很妙妙的规律哦!



//假装这里有一张二次元妹子



——register
虽然说放在寄存器可以提速,但我还是不建议用太多,,毕竟寄存器也就这么点,,在一些OJ上评测姬是多线程的,,你不RE誰来RE!!


#endif



finally:

祝各位OIer大佬在NOIP2017中AK哦!!!
祝刚步入OI圈的同学们get省一哦!!!
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!感谢你的提问。根据你的要求,我将为你解答关于NOIP2017普及t3问题的内容。 在这道题目中,我们需要解决一个关于棋盘的问题。题目描述了一个n×m的棋盘,每个格子上有一个非负整数。开始时,小明站在左上角的格子上,他可以向右或向下移动一步,每次移动的代价为目标格子上的数值。我们需要找到一条从左上角到右下角的路径,使得移动的总代价最小。 解决这个问题的一个常见的方法是使用动态规划(Dynamic Programming)。我们可以创建一个二维数组dp,其中dp[i][j]表示从起点到达坐标为(i, j)的格子时的最小代价。然后,我们可以按照从左上角到右下角的顺序依次计算dp数组的值。 具体的计算方法如下: 1. 首先,我们可以初始化dp数组的第一行和第一列,即dp[0][j]和dp[i][0],它们表示从起点到达第一行和第一列的格子时的最小代价。初始化的方法是累加前面的格子的代价。 2. 接下来,我们可以使用一个双重循环,从(1, 1)开始遍历整个棋盘。对于每个格子(i, j),我们可以选择从上方格子(i-1, j)或左方格子(i, j-1)中选择一个代价较小的路径,并加上当前格子的代价。即dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]。 3. 最后,当我们计算完dp数组的所有值后,dp[n-1][m-1]即为从起点到达右下角的格子时的最小代价。 这样,我们就可以得到从左上角到右下角的最小代价。希望能对你的问题有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值