最近写的文章好像还很多的。那么今天我们来讨论NOIP初赛的题型——完善程序。完善程序相对是比较难的题目了。全卷100分,完善程序占了大概26分,占比非常大。如果和英语考试试卷做比较,相当于首字母填空(估计是很多人的噩梦)。这类题型难度很大。本文讲一下做类似题目的方法。

不过首先,需要足够的知识储备,不然再多技巧也没用。

第一步:看提示,提示往往有很大的作用。

举例:NOIP2016第一题。

完善程序: **(读入整数)**请完善下面的程序,使得程序能够读入两个 int 范围内的整数, 并将这两个整数分别输出,每行一个。(第一、五空 2.5 分,其余 3 分)
输入的整数之间和前后只会出现空格或者回车。输入数据保证合法。

看题目我们知道,肯定不会太简单,会暗藏玄机在里面。本人第一次做题的时候第一反应是高精度。(不过题目已经说明在int范围了)实际上,我们根据题意,可以大致判断是快速读入相关的考察。关于快速读入,我之前写过一篇文章,可以看这里来参考一下。链接:

https://www.cnblogs.com/jisuanjizhishizatan/p/14977531.html

再看NOIP2007的。

完善程序:
(求字符的逆序)下面的程序的功能是输入若干行字符串,每输入一行,就按逆序输出该行,最后键入-1终止程序。请将程序补充完整。

这类题目好像很简单的水题。逆序输出,其实就是首尾做交换,到中间位置。设置i,j两个下标进行交换,循环条件i<=j。

第二步,分析算法。有的题目一下子想不出或者描述比较复杂的话,我们尝试分析算法。分析算法,根据题目描述或者根据残缺的代码进行分析。例如,NOIP2016:

本题采用二分法。对于区间[l, r],我们取中间点 mid 并判断租用到自行 车的人数能否达到 mid。判断的过程是利用贪心算法实现的。

根据题目我们可以直接知道是二分和贪心。我们截取一段代码分析:

while (l <= r) {
mid = (l + r) / 2;
if(④){
ans = mid;
l = mid + 1;
}else
r = ⑤;
}

if中肯定是对一个东西的判断。根据题意,判断的内容是租用自行车的人数能否达到mid。所以结果就是check(mid)。

第5空更加简单,上面l=mid+1,下面r就是mid-1。(对称性)

第三步,套用模版。如果一些题目,分析算法比较麻烦,我们可以套用一些题目的模版。

例如,NOIP2009放置国王。

完善程序:
(国王放置) 在n*m的棋盘上放置k个国王,要求k个国王互相不攻击,有多少种不同的放置方法。假设国王放置在第(x,y)格,国王的攻击的区域是:(x-1,y-1), (x-1,y),(x-1,y+1),(x,y-1),(x,y+1),(x+1,y-1),(x+1,y),(x+1,y+1)。读入三个数n,m,k,输出答案。题目利用回溯法求解。棋盘行标号为0~n-1,列标号为0~m-1。

看代码开头,知道是递归回溯法的模版。

CCF基础篇,这里我把对应的模版格式写下来了。

再例如,NOIP2008找第k大,直接二分模版。

完善程序:

(找第k大的数) 给定一个长度为1,000,000的无序正整数序列, 以及另一个数n (1<=n<=1000000), 然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4)。

大概就是这个样子。

第四步,分析空的含义。

第一类:初始化。NOIP2009:

int main(){
cin >> n;
for (i=1;i<=n;i++)
cin >> a[i];
tmp=0;
ans=0;
len=0;
beg= [ ① ] ;

我们就看这段,很明显是初始化,beg=0直接完成。

第二类,直接调用函数。NOIP2007第一题:

while(【③】)
{
cin >> line;
【④】;

第4空,是反转的,直接调用上面编写的reverse即可。

第三类,上下文推断。

NOIP2009第一题:

for (i=1;i<=n;i++){
if (tmp+a[i]>ans){
ans=tmp+a[i];
len=i-beg;
}
else if ( [ ② ] &&i-beg>len)
len=i-beg;

下面比上面少了ans=tmp+a[i],不需要赋值,并且根据后文推断出这一段并不是tmp+a[i]<ans的(如果是小于就要重置beg和tmp),因此这题填tmp+a[i]=ans。

NOIP2015打印日历:

for (i = 1; i <= ③; i++)
{
cout << ④;
if (i == dayNum[m] || ⑤ == 0)
cout << endl;
else
cout << '\t';
}

我们知道,每次输出的是日期。输入月份,输出的应该依次1到daynum[m]作为日期。

什么情况需要换行?我们知道,7天换一次行,因此是i%7。

如果你这样想,就错了!!!在月初,有一些空格。(请注意1前面4个空格)

空格的数量记录在哪里呢?是记录在offset变量的。因此,是(offset+i)%7。

然后我们看NOIP2015中位数。

mid = (lbound + rbound) / 2;
②;
for (i = 0; i < n; i++)
if (③)
④;
if (count > n / 2)
lbound = mid + 1;
else
⑤;

第二空是初始化类型,直接count=0。

第三空是上下文推断。下文有count,只有可能在这一语句里面出现count相关的东西。因此,推测第四空count++。

什么情况下count要++?这题求中位数,在之后要根据count的值在n的多少继续二分。我们假设,继续二分找中位数的区间在右边(从mid+1到rbound),说明count>n/2,一半以上的数小于中位数,刚好与count>n/2对应(一半以上的数小于count),因此这一空是x[i]>=mid。

第四类,对称性

也就是上面2015没有讲完的第五空,上面是mid+1,下面就是mid(注意此题比较特殊,不是mid-1,我就被坑过)很多二分的题目都是这样的。

全文完。

NOIP初赛:完善程序做题技巧的更多相关文章

  1. 从【BZOJ4173】谈做题技巧

    题目描述 ----------------------------------------------------------------------------------------------- ...

  2. 【NOIP 2016】初赛-完善程序 & 参考答案

    参考答案 感觉这两题目都挺好的~~ T1 交朋友 简单描述:有n个人依次进入教室,每个人进入会找一个身高绝对值相差最小的人交朋友(相同时更想和高的交朋友),求每个人交的朋友. Solution: So ...

  3. acm的做题技巧

    1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好不要用cin.cout,防止超时. (或加上 1 ios ...

  4. 简洁明了的Noip考场策略 / 平时做题也适用

    1.选择策略: 评估的标准得分的难度不是AC的难度 2.思考问题: 怀疑的眼光审视自己 3.写代码前: 想想可不可以换一种代码实现会好写很多 把自己的思路再理一遍,可以写到纸上,记下来大致关键顺序 4 ...

  5. ACM 做题过程中的一些小技巧。

    ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long l ...

  6. NOIP提高组—— 问题求解 与 完善程序

    问题求解1: 甲乙丙丁四人在考虑周末要不要外出郊游. 已知①如果周末下雨,并且乙不去,则甲一定不去:②如果乙去,则丁一定去:③如果丙去,则丁一定不去:④如果丁不去,而且甲不去,则丙一定不去.如果周末丙 ...

  7. noip做题记录+挑战一句话题解?

    因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...

  8. SAM 做题笔记(各种技巧,持续更新,SA)

    SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...

  9. 【OI新闻】2016.10.26 - NOIP初赛泄题再次引爆

    有点劲,开车注意点,小心翻啦~ http://www.noi.cn/noi-news/noi/743-ccfnoip2016 CCF在NOIP2016初赛结束后接到举报:初赛前(22日12时左右),网 ...

随机推荐

  1. 流动的观察者模式 | Flutter 设计模式

    观察者模式,又称发布订阅模式,是一种行为设计模式--你可以定义一种订阅机制,可在对象事件发生时通知多个 观察 该对象的其他对象. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主 ...

  2. Are You OK?主键、聚集索引、辅助索引

    每张表都一定存在主键吗? 关于这个问题,各位小伙伴们不妨先自己想一想,再往下寻找答案. 首先公布结论:对于 InnoDB 存储引擎来说,每张表都一定有个主键(Primary Key)! 让人非常遗憾的 ...

  3. 数据结构与算法-排序(十)桶排序(Bucket Sort)

    摘要 桶排序和基数排序类似,相当于基数排序的另外一种逻辑.它是将取值范围当做创建桶的数量,桶的长度就是序列的大小.通过处理比较元素的数值,把元素放在桶的特定位置,然后遍历桶,就可以得到有序的序列. 逻 ...

  4. 如果被问到 HTTP 协议,你真的能讲清楚吗?

    前段时间,在和许久未见的老同学聊天时,突然被问到 http 协议到底是什么?脑海里面第一时间想起来的就是 request 请求.response 响应之类的词汇,但是这样讲他真的能知道是什么吗?我反问 ...

  5. uwp 之语音识别

    xml code ---------------------------------------------- <Page x:Class="MyApp.MainPage" ...

  6. Best Cow Line

    给定长度为N的字符串s,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下列任意操作. -从S的头部删除一个字符,加到T的尾部 -从S的尾部删除一个宇符,加到T的尾部 目标是要构造字典序 ...

  7. save tran tranName

    begin tran 语句将 @@Trancount加 1.Rollback tran将 @@Trancount递减到 0,但 Rollback tran savepoint_name 除外,它不影响 ...

  8. servlet通过响应头Content-Disposition实现文件下载效果

    package day08; import java.io.File; import java.io.FileInputStream; import java.io.IOException; impo ...

  9. 初识cookie

    package day01.cookies; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEn ...

  10. linux系统下深度学习环境搭建和使用

    作为一个AI工程师,对Linux的一些技能的掌握也能从一定层面反应工程师的资深水平. 要求1:基于SSH的远程访问(本篇文章) 能用一台笔记本电脑,远程登陆一台linux服务器 能随时使用笔记本电脑启 ...