2019年全国青少年信息学(计算机)奥林匹克分区联赛普及组复赛试题
最新全国青少年信息学奥林匹克竞赛联赛试题大纲

全国青少年信息学奥林匹克竞赛联赛试题大纲一、试题形式每次联赛的试题分四组:普及组初赛题A1、普及组复赛题A2、提高组初赛题B1和提高组复赛题B2。
其中,A1和B1类型相同,A2和B2类型相同,但题目不完全相同,提高组难度高于普及组。
(一般初中学生参加普及组,高中或中专学生参加提高组)初赛:初赛全部为笔试,满分100分。
试题由四部分组成:1、选择题:共20题,每题1.5分,共计30分。
每题有5个备选答案,前10个题为单选题(即每题有且只有一个正确答案,选对得分),后10题为不定项选择题(即每题有1至5个正确答案,只有全部选对才得分)。
2、问题求解题:共2题,每题5分,共计10分。
试题给出一个叙述较为简单的问题,要求学生对问题进行分析,找到一个合适的算法,并推算出问题的解。
考生给出的答案与标准答案相同,则得分;否则不得分。
3、程序阅读理解题:共4题,每题8分,共计32分。
题目给出一段程序(不一定有关于程序功能的说明),考生通过阅读理解该段程序给出程序的输出。
输出与标准答案一致,则得分;否则不得分。
4、程序完善题:共2题,每题14分,共计28分。
题目给出一段关于程序功能的文字说明,然后给出一段程序代码,在代码中略去了若干个语句或语句的一部分并在这些位置给出空格,要求考生根据程序的功能说明和代码的上下文,填出被略去的语句。
填对则得分;否则不得分。
复赛:复赛的题型和考试形式与NOI类似,全部为上机编程题,但难度比NOI 低。
题目包括4道题,每题100分,共计400分。
每一试题包括:题目、问题描述、输入输出要求、样例描述及相关说明。
测试时,测试程序为每道题提供了5-10组测试数据,考生程序每答对一组得10-20分,累计分即为该道题的得分。
二、试题的知识范围1.初赛内容与要求:基本常识1.计算机和信息社会(信息社会的主要特征、计算机的主要特征、数字通信网络的主要特征、数字化);2.信息输入输出基本原理(信息交换环境、文字图形多媒体信息的输入输出方式);3.信息的表示与处理(信息编码、微处理部件MPU、内存储结构、指令,程序,和存储程序原理、程序的三种基本控制结构);4.信息的存储、组织与管理(存储介质、存储器结构、文件管理、数据库管理);5.信息系统组成及互连网的基本知识(计算机构成原理、槽和端口的部件间可扩展互连方式、层次式的互连结构、互联网络、TCP/IP 协议、HTTP协议、WEB应用的主要方式和特点);6.人机交互界面的基本概念(窗口系统、人和计算机交流信息的途径(文本及交互操作));7.信息技术的新发展、新特点、新应用等。
(noip2019)二十三届全国青少年信息学奥赛初赛试题及答案c++.doc

言简意赅,远见卓识,望君采纳,谢谢!删除水印可,编辑页眉,选中水印,点击删除。
第二十三届全国青少年信息学奥林匹克联赛初赛普及组 C++ 语言试题竞赛时间: 2019 年 10 月 14 日 14:30~16:30选手注意:●试题纸共有 7 页,答题纸共有 2 页,满分 100 分。
请在答题纸上作答,写在试题纸上的一律无效。
●不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。
一、单项选择题(共20 题,每题 1.5 分,共计30 分;每题有且仅有一个正确选项)1.在 8 位二进制补码中, 10101011 表示的数是十进制下的()。
A. 43B. -85C. -43D. -842. 计算机存储数据的基本单位是( A. bit B. Byte C. GB)。
D. KB3.下列协议中与电子邮件无关的是()。
A. POP3B. SMTPC. WTOD. IMAP4. 分辨率为A. 937.5KB 800x600 、16 位色的位图,存储图像信息所需的空间为(B. 4218.75KBC. 4320KBD. 2880KB)。
5.计算机应用的最早领域是()。
A. 数值计算B. 人工智能C. 机器人D. 过程控制6.下列不属于面向对象程序设计语言的是( A. C B. C++ C. Java D. C#)。
7.NOI 的中文意思是()。
A. 中国信息学联赛B. 全国青少年信息学奥林匹克竞赛C. 中国青少年信息学奥林匹克竞赛D. 中国计算机协会8.2017 年 10 月 1 日是星期日, 1999 年 10 月 1 日是()。
A. 星期三B. 星期日C. 星期五D. 星期二9.甲、乙、丙三位同学选修课程,从 4 门课程中,甲选修 2 门,乙、丙各选修3 门,则不同的选修方案共有()种。
A. 36B. 48C. 96D. 19210. 设 G 是有 n 个结点、 m 条边( n ≤m)的连通图,必须删去 G 的()条边,才能使得 G 变成一棵树。
少儿编程NOIP2019年普及组复赛试题

2019 年CCF 非专业级软件能力认证第二轮入门级2019 CCF CSP-J2时间:2019 年11 月16 日14:30 - 18:00二.提交源程序文件名注意事项:1.文件名(程序名和输入输出文件名)必须使用英文小写。
2.C/C++ 中函数main() 的返回值类型必须是int,程序正常结束时的返回值必须是0。
3.提交的程序代码文件的放置位置请参照各省的具体要求。
4.因违反以上三点而出现的错误或问题,申诉时一律不予受理。
5.程序可使用的栈内存空间限制与题目的内存限制一致。
6.全国统一评测时采用的机器配置为:Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz,内存32GB。
上述时限以此配置为准。
7.只提供Linux 格式附加样例文件。
8.评测在当前最新公布的NOI Linux 下进行,各语言的编译器版本以其为准。
9.最终评测时所用的编译命令中不含任何优化开关。
数字游戏(number.cpp/c/pas)【问题描述】小K 同学向小P 同学发送了一个长度为8 的01 字符串来玩数字游戏,小P 同学想要知道字符串中究竟有多少个1。
注意:01 字符串为每一个字符是0 或者1 的字符串,如“101”(不含双引号)为一个长度为3 的01 字符串。
【输入格式】输入文件名为number.in。
输入文件只有一行,一个长度为8 的01 字符串s。
【输出格式】输出文件名为number.out。
输出文件只有一行,包含一个整数,即01 字符串中字符 1 的个数。
见选手目录下的number/number1.in 和number/number1.ans。
【输入输出样例1 说明】该01 字符串中有 2 个字符1。
见选手目录下的number/number2.in 和number/number2.ans。
【输入输出样例2 说明】该01 字符串中有8 个字符1。
【输入输出样例3】见选手目录下的number/number3.in 和number/number3.ans。
noip2019第十年全国青少年信息学奥林匹克联赛普及组复赛试题

noip2019第十年全国青少年信息学奥林匹克联赛普及组复赛试题〔普及组三小时完成〕【一】不高兴的津津【问题描述】津津上初中了。
妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。
另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。
但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。
假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。
请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。
【输入文件】输入文件unhappy.in包括七行数据,分别表示周一到周日的日程安排。
每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。
【输出文件】输出文件unhappy.out包括一行,这一行只包含一个数字。
如果不会不高兴那么输出0,如果会那么输出最不高兴的是周几〔用1,2,3,4,5,6,7分别表示周一,周二,周三,周四,周五,周六,周日〕。
如果有两天或两天以上不高兴的程度相当,那么输出时间最靠前的一天。
【样例输入】53627253540406【样例输出】3【二】花生采摘(peanuts.pas/dpr/c/cpp)【问题描述】鲁宾逊先生有一只宠物猴,名叫多多。
这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。
鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。
在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格〔如图1〕。
有经验的多多一眼就能看出,每棵花生植株下的花生有多少。
为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。
”我们假定多多在每个单位时间内,可以做以下四件事情中的一件:1)从路边跳到最靠近路边〔即第一行〕的某棵花生植株;2)从一棵植株跳到前后左右与之相邻的另一棵植株;3)采摘一棵植株下的花生;4)从最靠近路边〔即第一行〕的某棵花生植株跳回路边。
noip信息学联赛2019模拟试卷(四)解析

第二十五届全国青少年信息学奥林匹克联赛初赛(普及组 C++语言试题)竞赛时间:2019年10月13日14:30~16:30选手注意:●试题纸共有7页,答题纸共有2页,满分100分。
请在答题纸上作答,写在试题纸上一律无效。
●不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料一.单项选择题(共20题,每题1.5分,共计30分。
每题有且仅有一个正确答案.)1.(2019)12+(9102)16=:14.dos、unix和windows的共同点是:A:都是硬件B:都是联网系统软件C:都是应用软件D:都已经过时15.html是一种高级语言,以下操作可以查看html代码的是:A:打开浏览器按F11 B:运行html.exeC:无法查看D:打开浏览器按F1216.以下关于计算机病毒的说法正确的是:A:防火墙可以防止感染B:通过生物传播C:一旦感染无法破解D:计算机一次感染终身免疫17.c++语言“实数下取整”操作是:A:(int)x B:float(x) C:floor(x) D:ceil(x)18.一棵n层二叉树的最多节点数减去最少节点数等于:A:2*n B:2n-n C:n2-n D:n*log2(n)-n19.现给出以下程序:#include<bits/stdc++.h>using namespace std;int i,x;int a[11]={0,10,2,3,5,14,8,20,1,7,-1};int main(){cin>>x;sort(a+1,a+11);for (i=1;i<=10;i++)if (a[i]>=x) break;cout<<i<<endl;}问若将此程序的输入输出看做函数,则此函数的图像不经过点:A:(0,2)B:(2,4)C:(11,9)D:(21,11)20.上题程序划线部分可替换为:A: cout<<upper_bound(a,a+10,x)<<endl;B: cout<<upper_bound(a+1,a+11,x)<<endl;C: cout<<upper_bound(a+1,a+11,x)-a<<endl;D: cout<<lower_bound(a+1,a+11,x)-a<<endl;二.问题求解(共2题,每题5分,共计10分)1.五位数的卡布列克运算循环节为:注释:卡布列克运算为将一数的所有数位数字重新排列可得的数的最大值减最小值(高位补零),保证有循环节,本题有三个答案,写出一个即得5分,各数字用逗号隔开。
2019年NOIP普及组C试题

第二十三届全国青少年信息学奥林匹克联赛初赛普及组 C++语言试题竞赛时间:2017 年 10 月 14 日 14:30~16:30选手注意:试题纸共有 7 页,答题纸共有 2 页,满分 100 分。
请在答题纸上作答,写在试题纸上的一律无效。
不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。
一、单项选择题(共 20 题,每题 分,共计 30 分;每题有且仅有一个正确选项)1. 在 8 位二进制补码中, 表示的数是十进制下的( )。
A. 43B. -85C. -43D. -842. 计算机存储数据的基本单位是( )。
A. bitB. ByteC. GBD. KB 3. 下列协议中与电子邮件无关的是( )。
A. POP3 B. SMTP C. WTO D. IMAP4. 分辨率为 800x600、16 位色的位图,存储图像信息所需的空间为( )。
A. B. C. 4320KB D. 2880KB5. 计算机应用的最早领域是( )。
A. 数值计算B. 人工智能C. 机器人D. 过程控制 6. 下列不属于面向对象程序设计语言的是( )。
A. C B. C++ C. Java D. C# 7. NOI 的中文意思是( )。
A. 中国信息学联赛 B. 全国青少年信息学奥林匹克竞赛 C. 中国青少年信息学奥林匹克竞赛 D. 中国计算机协会 8. 2017 年 10 月 1 日是星期日,1999 年 10 月 1 日是( )。
A. 星期三B. 星期日C. 星期五D. 星期二9. 甲、乙、丙三位同学选修课程,从 4 门课程中,甲选修 2 门,乙、丙各选修3 门,则不同的选修方案共有( )种。
CCF NOIP2017 初赛普及组 C++语言试题第1页,共7页A.36B. 48C.96D. 19210. 设G是有n个结点、m条边(n≤m)的连通图,必须删去 G 的()条边,才能使得G变成一棵树。
全国青少年信息学奥林匹克联赛培训习题与解答

全国青少年信息学奥林匹克联赛培训习题与解答第一章计算机基础知识1、我国先后自行研制成功“银河”系列的巨型计算机,其中:“银河”于1983年问世,其运算速度为每秒 1亿次;―银河Ⅱ‖于1992年诞生,其运算速度为每秒 10亿次;“银河Ⅲ”于1997年通过国家鉴定,其运算速度为每秒130亿次。
2、计算机的特点:运算速度快、计算精度高,可靠性好、有记忆和逻辑判断能力、有自动0程序的能力、可处理各种类型的数据与信息。
3、计算机应用于:数字计算、信息处理、辅助设计(CAD)和辅助教学(CAI)、工业控制、多媒体应用、网络技术。
4、下列软件均属于操作系统的是:B (因为WPS、WORD、FOXBASE是应用软件)(A)WPS与PC DOS (B)WINDOWS与MS DOS(C)WORD与WINDOWS (C)FOXBASE与OS/25、操作系统是重要的系统软件,下面几个软件中不属于操作系统的是 C(A)MS-DOS (B)UCDOS (C)PASCAL (D)WINDOWS956、MS-DOS系统对磁盘信息进行管理和使用是以A 为单位的。
【对磁盘信息的存取必须以访问文件方式进行】(A)文件(B)盘片(C)字节(D)命令7、在计算机内部用来传送、存贮、加工处理的数据或指令(命令)都是以C 形式进行的【计算机内部无论是数据还是命令都需要转换成二进制码才能传送、存贮、加工处理】(A)十进制码(B)智能拼音码(C)二进制码(D)五笔字型码8、微机内的存储器的地址是以( B )编址的。
【字长表示一个存储单元由多少位数组成,八位机的一个字长是1B,十六位机的一个字长是2B,字长位越多,可访问的存储器的地址也越多】(A)二进制位(B)字长(C)字节(D)微处理器的型号9、下列诸因素中,对微机工作影响最小的是( B )(A)尘土(B)噪声(C)温度(D)湿度10、在24*24点阵的字库中,汉字“一”与“编”的字模占用字节数分别是( C )(A)32、32 (B)32、72 (C)72、72 (D)72、32【在汉字编码中,字模汉字占用字节数与笔画的多少无关,因每行24点需要3B存储空间,24行共需要72B存储空间】11、将DOS系统盘插入A驱动器启动机器,随后使用一批应用软件,在此过程中,DOS系统盘(C)(A)必须始终插入在A驱动器中(B)不必再用(C)可能有时要插入A驱动器中(D)可能有时要插入B驱动器中【因机器启动成功后,常用命令常驻内存中,当需要调用操作系统中的外部命令时,需要再次再次插入A盘】12、计算机能直接执行的指令包括两部分,它们是(B)(A)源操作数与目标操作数(B)操作码与操作数(C)ASCII码与汉字代码(D)数字与字符【因计算机指令系统由操作码和操作数组成】13、在微机中,通用寄存器的位数是( C )(A)8位(B)16位(C)计算机字长(D)32位【因微机寄存器的位数与机器有关,取决于计算机字长】14、在计算机中,ASCII码是( B )位二进制代码(A)8 (B)7 (C)12 (D)16【表示27个状态,用128个不同的二进制编码来表示控制符号、十进制数、字符、大小写英文字母,最高位设置为0】15、计算机的软件系统通常分为( A )(A)系统软件与应用软件(B)高级软件与一般软件(C)军用软件与民用软件(D)管理软件与控制软件16、启动计算机引导DOS是将操作系统( D )(A)从磁盘调入中央处理器(B)从内存储器调入高速缓冲存储器(C)从软盘调入硬盘(D)从系统盘调入内存储器17、不同的计算机,其指令系统也不相同,这主要取决于( C )(A)所用的操作系统(B)系统的总体结构(C)所用的CPU (D)所用程序设计语言【CPU包括运算器、控制器,所有的控制和运算操作,均由控制器中的微指令进行操作。
NOI2019笔试题库及答案

NOI2019笔试题库及答案1.NOI 机试使用的操作系统是:Linux2.Linux 中为文件改名使用的命令是:mv <旧文件名> <新文件名>3.在Linux 中返回上一级目录使用的命令是:cd ..4.在Linux 中删除当前目录下的test 目录的命令是:rm -r test5.当前目录下有一个编译好的可执行文件 a.out,执行它使用的命令是:./a.out6.使用高级语言编写的程序称之为:源程序7.在NOI Linux 系统中可以用来调试程序的程序是:gdb8.在Linux 系统中,文件夹中的文件可以与该文件夹同名吗:可以9.Linux 系统中杀死名为test 的后台进程的命令是:killall test10.Linux 系统中可以查看隐藏文件的命令是:ls -a11.Linux 系统中编译C 程序的编译器是:gcc12.Linux 系统中编译Pascal 程序的编译器是:fpc13.Linux 系统中编译C++程序的编译器是:g++14. Linux 系统中,将当前目录下的文件名打印到tmp 文件中的命令是:ls >tmp 15.Linux 系统中,测量当前目录下程序test 运行时间的命令是:time ./test16. vim 编辑器中,强制退出不保存修改应当输入::q!17. vim 编辑器中,强制退出并保存修改可输入以下三种命令之一::wq、ZZ、:x18.vim 编辑器中,定位到文件中第12 行应当输入::1219. vim 编辑器中,在文件中查找字符串“12”应当输入:/1220.使用gcc 编译C 程序时,生成调试信息的命令行选项是:-g21. 使用gcc 编译C 程序时,生成所有警告信息的命令行选项是:-Wall22.使用gcc 编译C 程序时,只编译生成目标文件的命令行选项是:-c23.使用gcc 编译C 程序时,指定输出文件名的命令行选项是:-o24.如果C 程序中使用了math.h 中的函数,在编译时需要加入选项:-lm25. Linux 系统中具有最高权限的用户是:root26. 在Linux 的各个虚拟控制台间切换的快捷键是:Ctrl+Alt+F[1-6]27. 在NOI Linux 中,从字符控制台切换回桌面环境使用的快捷键是:Ctrl+Alt+F728.在NOI Linux 中默认使用的Shell 是:bash29.在Linux 中查看当前系统中的进程使用的命令是:ps30.在Linux 中查看进程的CPU 利用率使用的命令是:ps31. 如果自己的程序进入死循环,应当如何终止:Ctrl-C32. 可执行文件a.out从标准输入读取数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NOIP2002普及组解题报告题一:级数求和[问题描述]::Sn=1+1/2+1/3+…+1/n。
显然对于任意一个整数K,当n足够大的时候,Sn大于K。
现给出一个整数K〔1<=K<=15〕,要求计算出一个最小的n,使得Sn>K[问题分析]:这道题目非常简单,题目的意思已经把该题的算法描述得再清楚不过了,初始时Sn=0,n=0,然后每次循环n←n+1,Sn←Sn+1/n,,直到Sn大于K,最后输出K。
另外实型(Real 是最慢的,建议用Extended)的运算速度不是很快,而K为1~15之间的整数,所以最后可以交一张表〔常量数组〕,以达到最好的效果[参考程序]:programc1;varK:Byte;n:Longint;Sn:Extended;beginReadln(K);Sn:=0;n:=0;RepeatInc(n);Sn:=Sn+1/n;UntilSn>k;Writeln(n);end.题二:选数[问题描述]:n〔1<=n<=20〕个整数x1,x2,…,xn〔1<=xi<=5000000〕,以及一个整数k〔k<n〕。
从n 个整数中任选k个整数相加,可分别得到一系列的和。
现在,要求你计算出和为素数共有多少种。
[问题分析]:此题动态规划无从下手,也无数学公式可寻,看来只能搜索〔组合的生成算法〕,其实1<=n<=20这个约束条件也暗示我们此题搜索是有希望的,组合的生成可用简单的DFS来实现,既搜索这k个整数在原数列中的位置,由于组合不同于排列,与这k个数的排列顺序无关,所以我们可以令a[I]<a[I+1]〔a[I]表示第I个数在原数列中的位置〕,这个组合生成算法的复杂度大约为C(n,k),下面给出递归搜索算法的框架:接下来的问题就是判断素数,判断一个整数P(P>1)是否为素数最简单的方法就是看是否存在一个素数a(a<=sqrt(P))是P的约数,如果不存在,该数就为素数,由于在此题中1<=xi<=5000000,n<=20,所以要判断的数P不会超过100000000,sqrt(p)<=10000,因此,为了加快速度,我们可以用筛选法将2…10000之间的素数保存到一个数组里〔共1229个〕,这样速度估计将提高5~6倍。
特别注意:此题是要求使和为素数的情况有多少种,并不是求有多少种素数,比赛时就有很多同学胡乱判重而丢了12分;还有1不是素数,在判素数时要对1做特殊处理。
[参考程序]programc2;constMaxN=20;varN,M,i:Byte;ans,s:Longint;x:array[1..MaxN]ofLongint;f:array[1..10000]ofByte;p:array[1..1229]ofInteger;procedureGet_Prime;vari,j,s:Integer;begins:=0;f[1]:=0;fori:=2to10000dof[i]:=1;fori:=2to10000doiff[i]=1thenbeginInc(s);p[s]:=i;j:=2*i;whilej<=10000dobeginf[j]:=0;Inc(j,i)end;endend;procedureWork(S:Longint);vari:Integer;beginifS<=10000thenInc(ans,f[S])elsebegini:=1;whilesqr(longint(p[i]))<=SdobeginifSmodp[i]=0thenExit;Inc(i)end;Inc(ans)endend;procedureSearch(d,pre:Byte);vari:Byte;beginfori:=pre+1toN-(M-d)dobeginInc(S,x[i]);ifd=MthenWork(S)elseSearch(d+1,i);Dec(S,x[i])endend;beginReadln(N,M);fori:=1toNdoRead(x[i]);ans:=0;S:=0;Get_Prime;Search(1,0);Writeln(ans)end.题三:产生数[问题描述]:给出一个整数n(n<10^30)和k个变换规那么〔k<=15〕。
规那么:1个数字可以变换成另一个数字规那么的右部不能为零。
问题:给出一个整数n和k个规那么求出:经过任意次的变换〔0次或多次〕,能产生出多少个不同的整数。
[问题分析]:认真分析题目之后发现,此题搜索显然是不行的,而且对于只需计数而不需求具体方案的题目,一般都不会用搜索解决,其实此题不难看出,可以用乘法原理直接进行计数,用Fi表示数字i包括本身可以变成的数字总个数〔这里的变成可以是直接变成也可以是间接变成,比如3->5,5->7,那么3->7〕,那么对于一个数a〔用数组存,长度为n〕,根据乘法原理它能产生出F[a[1]]*F[a[2]]*F[a[3]]*…F[a[n]]个不同整数,相信这一点大家不难理解。
那么现在的关键就是如何求Fi,由于这些变换规那么都是反应的数字与数字之间的关系,这很容易让我们想到用图来表示这种关系:1:建立一个有向图G,初始化g[i,j]←False2:如果数字i能直接变成数字j,那么g[i,j]←True容易知如果数字i能变成数字j,那么i到j必须存在路径,否那么i是不可能变成j的,这样一来,Fi的求解就显得非常简单了,求一个顶点v包括本身能到达的顶点数的方法相当多,可以用BFS,DFS,Dijkstra,Floyd,这里介绍一种类似Floyd的有向图的传递闭包算法,该算法实现简单,在解决这类问题时比Floyd效率更高,所谓有向图的传递闭包就是指可达性矩阵A=[a[i,j]],其中a[i,j]=True从i到j存在通路a[i,j]=False从i到j不存在通路所以有向图传递闭包算法只需将floyd算法中的算术运算符操作‘+’用相应的逻辑运算符‘and’和’or’代替就可以了,其算法如下:fork←1tondofori←1tondoforj←1tondoa[i,j]=a[i,j]or(a[i,k]anda[k,j])最后值得注意的是当n很大时输出可能会超过Comp类型的范围,所以要使用高精度乘法,由于高精度算法是信息学竞赛中的基础,这里就不在详述。
[参考程序]programc3;constMaxLen=30;varLen,M:Byte;a:array[1..MaxLen]ofByte;f:array[0..9]ofByte;g:array[0..9,0..9]ofBoolean;procedureInit;vari:Byte;St:String;beginReadln(st);Len:=0;M:=0;i:=1;whilest[i]in['0'..'9']dobeginInc(Len);a[Len]:=Ord(st[i])-48;Inc(i)end; Repeatifst[i]in['0'..'9']thenM:=M*10+Ord(st[i])-48; Inc(i)Untili>Length(st)end;procedureMain;vari,j,k:Byte;beginFillchar(g,Sizeof(g),False);fork:=1toMdobeginReadln(i,j);g[i,j]:=Trueend;fork:=0to9dofori:=0to9doforj:=0to9dog[i,j]:=g[i,j]or(g[i,k]andg[k,j]);Fillchar(f,Sizeof(f),0);fori:=0to9dog[i,i]:=True;fori:=0to9doforj:=0to9doInc(f[i],Ord(g[i,j]))end;procedureShow;vari,j,k,g:Byte;ans:Array[1..MaxLen]ofByte;beginFillchar(ans,Sizeof(ans),0);ans[1]:=1;fork:=1toLendobeging:=0;fori:=1toMaxLendobeginans[i]:=ans[i]*f[a[k]]+g;g:=ans[i]div10;ans[i]:=ans[i]mod10endend;j:=MaxLen;Whileans[j]=0doDec(j);fori:=jdownto1doWrite(ans[i]);Writelnend;beginInit;Main;Showend.题四:过河卒[问题描述]:棋盘上A点有一个过河卒,需要走到目标B点。
卒行走的规那么:可以向下、或者向右。
同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。
棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过20的整数),同样马的位置坐标是需要给出的。
现在要求你计算出卒从A点能够到达B点的路径的条数[问题分析]:这是一道老得不能再老的题目了,很多书上都有类似的题目,NOIp97普及组的最后一题就和此题几乎一模一样。
有些同学由于没见过与之类似的题目,在比赛时用了搜索,当n 到14,15左右就会超时,其实,此题稍加分析,就能发现:要到达棋盘上的一个点,只能从左边过来或是从上面下来,所以根据加法原理,到达某一点的路径数目,等于到达其相邻上,左两点的路径数目之和,因此我们可以使用逐列〔或逐行〕递推的方法来求出从起始顶点到重点的路径数目,即使有障碍〔我们将马的控制点称为障碍〕,这一方法也完全适用,只要将到达该点的路径数目置为0即可,用F[i,j]表示到达点(i,j)的路径数目,g[i,j]表示点(i,j)有无障碍,递推方程如下:F[0,0]=1F[i,j]=0{g[x,y]=1}F[i,0]=F[i-1,0]{i>0,g[x,y]=0}F[0,j]=F[0,j-1]{j>0,g[x,y]=0}F[i,j]=F[i-1,j]+F[i,j-1]{i>0,j>0,g[x,y]=0}此题与第三题一样,也要考虑精度问题,当n,m都很大时,可能会超过MaxLongInt,所以要使用Comp类型计数(Comp类型已经足够了,即使n=20,m=20,没有任何障碍的情况下的结果也只有14,5位的样子)。
[参考程序]{$R-,S-,I-,Q-,N+}programc4;constdx:array[1..8]ofShortint=(-2,-1,1,2,2,1,-1,-2);dy:array[1..8]ofShortint=(1,2,2,1,-1,-2,-2,-1);varn,m,x,y,i,j:Byte;g:array[0..20,0..20]ofByte;f:array[0..20,0..20]ofComp;beginReadln(n,m,x,y);Fillchar(g,Sizeof(g),0);g[x,y]:=1;fori:=1to8doif(x+dx[i]>=0)and(x+dx[i]<=n)and(y+dy[i]>=0)and(y+dy[i]<=m)theng[x+dx[i],y+dy[i]]:=1;f[0,0]:=1;fori:=1tondoifg[i,0]=0thenf[i,0]:=f[i-1,0];fori:=1tomdoifg[0,i]=0thenf[0,i]:=f[0,i-1];fori:=1tondoforj:=1tomdoifg[i,j]=0thenf[i,j]:=f[i-1,j]+f[i,j-1];Writeln(f[n,m]:0:0)end.总结:四道题目其实都很容易,要想到正确可行的方法并不难,考察的是大家的编程基础,一些基本算法的简单应用,并不需要什么优化技巧,关键是看大家对这些基本算法是否已熟练掌握,只有熟练掌握这些算法,在考试中才能在较短的时间内做好每道题,我们一定要重视基础!。