◆程序笔记◆◇第五期◇你好,NOIP

NOIP 2017-你好吗?


解释一下:
这篇 Blog 不是我自发地要写的,因此可能会有点水,不要在意……
老师让编程社的全体学员在这NOIP的暴风雨来临之前的宁静中写下了这一篇blog,就这样,数篇世界级的水博客诞生了!
然后再说一下,本来这篇 Blog 是准备在NOIP开始之前写好给自己打打底气的,不过现在看来好像没有什么用了(已经考完了)。


一、 总结一下

学了这么久的 C++ ,不禁想到——自己都学了些啥?NOIP 要来了,这是作者迎接的第一场正式竞赛(新手上路,多多包涵),总应该有些准备吧。
C++?算法?

(1) STL 容器的那些事
① vector<>

动态数组——这是一个非常有用的容器,通常我们为了不访问到数组未定义到的位置,会把数组定义得大一些。看着这么多内存白白浪费掉,有些心疼……所以这就是第一个 STL 容器,能够随时改变自己占用的空间大小。它是可以用sort排序的,用法是:sort(vec.begin(),vec.end()); //vec是动态数组的名字
但是最有用的是它能够“套”着用——vector< /*变量类型*/ >本身就作为一个变量名使用,所以能够这样套——vector<vector</*变量类型*/> >,相当于一个二维数组(注意最后的2个 ‘>’ 要分开写 ,不然会被 C++ 认为是 “>>”)。

② map<>

关联式容器——这个容器能让自己的代码更加清晰,尽管速度有些慢……它可以以任意变量类型(这里不包含STL容器)为下标,然后你就会发现它能处理负数(︿( ̄︶ ̄)︿)。

③ set<>

这玩意很少用,但是还是提一下——集合,和数学的集合一样。它的元素类型必须是一个定义了 ‘<’ 运算符的类型。它是无序的,也就是说不能像动态数组一样 Set[i] 这样调用,但是它能够自动舍弃重复的变量,并且排序,速度非常之快。

④ queue<>

这应该是我学的第一个容器了——首次应用在广度优先搜索中。比模拟队列要方便得多——不担心访问越界。模板在这里:

    while(!que.empty()) //队列不空
    {
        for(int i;i< /*情况数量*/ ;i++)
        {
            /*定义新*/
            if(/*到达终点*/)
                /*结束*/;
            que.push(/*新的状态*/);
        }
        que.pop();
    }
⑤ priority_queue<>

优先队列——图论算法之一SPFA。维护数组专用((~ ̄▽ ̄)~),分有大根堆和小根堆,但是重载的都是 ‘<’ 运算符。注意——大根堆前小,小根堆前大

//比如自定义的变量类型名是Bin,比较其中F变量的大小
/*大根堆*/bool operator <(Bin a,Bin b){return a.F<b.F;}
/*小根堆*/bool operator <(Bin a,Bin b){return a.F>b.F;}
(2) 我觉得要考的算法
①二分查找

这是一个速度为 O(n logn) 的算法,但是它必须是在一个按一定条件有序排列的数组里查找——定义左右边界,范围只能大,但是不能小(最好是刚包含所有的查找范围)。一般来说左右边界都是int(如果是其他类型,则需要按照精度要求调整),模板放这里:

while(left+F/*F是精度*/<right)
{
    /*变量类型*/ mid=(left+right)/2;
    if(check(mid)) //建议把判断写作check()函数
        left=mid;
    else
        right=mid;
}

关键是check()函数,如果不知道什么时候压缩右边界,什么时候压缩左边界的话——就都试一下吧。自己出一下数据吧,一般来说都是找得到错误的——如果与你的答案与正确答案不一样,把 left 和 right 的位置换一下,再试一次——还不对,就是check()整个都写错了(如果正确就恭喜啦(^-^)V)。
@有这么一道题:膨胀的木棍(这根木棍很膨胀)

②深度优先搜索

暴力搜索——“暴力出奇迹”。如果是正确的做法的话可能会要求剪枝,最简单的一种剪枝的方法是判断用bool数组判断重复。除去这一点——可以用记忆化搜索,这样就比较像 动态规划(应该考不到这么难吧) 了。

③动态规划

最后恐怕就是DP了(⁽⁽ଘ( ˊᵕˋ )ଓ⁾⁾*),一般来说是用记忆化搜索。要从状态入手,主要有 背包问题区间DP。背包问题的状态是 g[i][j] 表示:前用前i个物品填补剩余的容量j所得的最大价值;区间DP的状态 g[i][j] 表示:从 i到j的区间内的最大价值

二、一些小工具

(1)对拍不用手点- .bat文件

先创建一个记事本,然后打上这个模板:

@echo off //不显示运行信息
:loop
数据生成器的EXE文件>数据储存处 //生成数据(标准输出)
我的EXE文件<数据储存处>我的程序输出 //生成输出(标准输入输出)
正解EXE文件<数据储存处>正解输出 //生成输出(标准输入输出)
fc/A 我的程序输出 正解输出 
if not errorlevel 1 goto loop //没有错误->再次对拍
pause
goto loop //如果不需要找到错误后继续找错误,就输出

下列步骤:
我的电脑 -> (左上角)组织 -> 文件夹和搜索选项 -> 查看 -> 高级设置 -> 关闭“隐藏已知文件的扩展名”
然后把你写的记事本的“.txt”扩展名改为“.bat”就行了。
这里写图片描述

(2)数据生成器

直接上 Blog-随机数据生成器

三、策略是基础

(1)准备要充分

一进考场,试机完毕后,趁考试没开始,打上头文件(“cstdio”、“algorithm”、“iostream”、“cstring”都打上吧)。还有每个程序框架——一般来说加上一个 freopen :

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    return 0;
}

把这些必要的框架打完,复制到4个cpp文件(NOIP 4道题嘛)里,心里就有底了。

(2)时间很充裕,代码不着急

NOIP的普及组初赛难度并不是非常高,而且时间还很长(3时30分),所以一来不要忙着把第一题和第二题刷了(虽然都是水题)。这里有一个小建议——先把所有4道题都看完,自己心里有一个目标,把每一道题自己的目标分数先定好,加一个注释打在每一道题的程序开头,顺便把自己觉得会怎么错的原因写在旁边(比如“栈空间爆炸”什么的)。接下来仔细读题,分析每一道题主要考察的算法,也写在程序开头。
不过注意一下代码的字节数,不要超过限制了。回首当年,某位大牛兴高采烈地觉得自己能够 AK ,结果…3、4题0分,原因是他把注释写得太多了!以至于评测软件检测到该程序过大,不予理睬,直接0分。汉字(包括中文字符)的字节数是非常庞大的,这就是为什么没有一个编程语言是以中文为基础来编写的原因!

(3)不会做就别做了

初赛真正拉分的题是第三、四题,偶尔会有难度,是给真正的大牛表现自己的才能的题目。所以像我们这样入门小白就还是不要太勉强。如果一道题写了30分钟都还比较乱,不如用“暴力搜索”,正所谓“骗分过样例,暴力出奇迹”。

(4)别人做什么和我什么关系?

有一些学校会为了拉一些人数,强制一些本身能力不是特别强的学生参赛(还好作者的学校没有)。因此在考试时发现自己附近的某位同学自暴自弃、不知所措是非常正常的。这时候我们需要坚定自我,不要自甘堕落(像前者一样)。

四、非常感谢

如果你看到了这里,真的十分感谢(ヽ( ̄▽ ̄)ノ)。毕竟这是一篇“水 Blog”。相信对于不少同学,这次NOIP也是自己的第一次正式竞赛。希望我的一些博客能帮到大家(反正作者也考完了)。
NOIP涉及到的算法——模拟;二分查找;分治;搜索(深度优先、广度优先);贪心;动态规划


The End

Thanks for reading!

-Lucky_Glass


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值