NOIP2014普及组复赛 螺旋矩阵

合集下载

NOIP2014普级组复赛试题

NOIP2014普级组复赛试题

CCF全国信息学奥林匹克联赛(NOIP2014)复赛普及组(请选手务必仔细阅读本页内容)一.题目概况中文题目名称珠心算测试比例简化螺旋矩阵子矩阵英文题目与子目录名count ratio matrix submatrix 可执行文件名count ratio matrix submatrix 输入文件名count.in ratio.in matrix.in submatrix.in 输出文件名count.out ratio.out matrix.out submatrix.out 每个测试点时限1秒1秒1秒1秒测试点数目10 10 10 20 每个测试点分值10 10 10 5 附加样例文件有有有有结果比较方式全文比较(过滤行末空格及文末回车)题目类型传统传统传统传统运行内存上限128M 128M 128M 128M二.提交源程序文件名对于C++语言count.cpp ratio.cpp matrix.cpp submatrix.cpp 对于C语言count.c ratio.c matrix.c submatrix.c 对于pascal语言count.pas ratio.pas matrix.pas submatrix.pas三.编译命令(不包含任何优化开关)对于C++语言g++ -o countcount.cpp -lm g++ -o ratioratio.cpp -lmg++ -o matrixmatrix.cpp -lmg++ -o submatrixsubmatrix.cpp -lm对于C语言gcc -o countcount.c -lm gcc -o ratio ratio.c-lmgcc -o matrixmatrix.c -lmgcc -o submatrixsubmatrix.c -lm对于pascal语言fpc count.pas fpc ratio.pas fpc matrix.pas fpc submatrix.pas注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。

NOIP2014初赛普及组C++题目及答案

NOIP2014初赛普及组C++题目及答案

NOIP2014初赛普及组C++题目及答案第二十届全国青少年信息学奥林匹克联赛初赛普及组C++语言试题2014年一、快单项选择题(共20题,每题1.5分,共计30分;每题有且仅有一个正确选项)⒈以下哪个是面向对象的高级语言( )。

A.汇编语言B.C++C.FortranD.Basic⒉1TB代表的字节数是( )。

A.2的10次方B.2的20次方C.2的30次方D.2的40次方⒊二进制数00100100和00010101的和是( )。

A.00101000B.001010100C.01000101D.00111001⒋以下哪一种设备属于输出设备( )。

A.扫描仪B.键盘C.鼠标D.打印机⒌下列对操作系统功能的描述最为完整的是( )。

A.负责外设与主机之间的信息交换B.负责诊断机器的故障C.控制和管理计算机系统的各种硬件和软件资源的使用D.将没有程序编译成目标程序⒍CPU、存储器、I/O设备是通过( )连接起来的。

A.接口B.总线C.控制线D.系统文件⒎断电后会丢失数据的存储器是( )。

A.RAMB.ROMC.硬盘D.光盘⒏以下哪一种是属于电子邮件收发的协议( )。

A.SMTPB.UDPC.P2PD.FTP⒐下列选项中不属于图像格式的是( )。

A.JPEG格式B.TXT格式C.GIF格式D.PNG格式⒑链表不具有的特点是( )。

A.不必事物估计存储空间B.可随机访问任一元素C.插入删除不需要移动元素D.所需空间与线性表长度成正比⒒下列各无符号十进制整数中,能用八位二进制表示的数中最大的是( )。

A.296B.133C.256D.199⒓下列几个32位IP地址中,书写错误的是( )。

A.162.105.135.27B.192.168.0.1C.256.256.129.1D.10.0.0.1⒔要求以下程序的功能是计算:s=1+1/2+1/3+...+1/10。

#include <iostream>using namespace std;int main(){int n;float s;s = 1.0;for(n = 10; n > 1; n--)s = s + 1 / n;cout << s << endl;return 0;}程序运行后输出结果错误,导致错误结果的程序行是( )。

【通用】信息学奥赛NOIP普及组历届试题分析.ppt

【通用】信息学奥赛NOIP普及组历届试题分析.ppt
枚举法其实是最简单的搜索算法。
.,.,
4
珠心算测验 (noip2014普及组第一题)
珠心算是一种通过在脑中模拟算盘变化来完成快 速运算的一种计算技术。珠心算训练,既能够开 发智力,又能够为日常生活带来很多便利,因而 在很多学校得到普及。
某学校的珠心算老师采用一种快速考察珠心算加 法能力的测验方法。他随机生成一个正整数集合, 集合中的数各不相同,然后要求学生回答:其中 有多少个数,恰好等于集合中另外两个(不同的) 数之和? 最近老师出了一些测验题,请你帮忙求 出答案。
不过,如果把调查结果就以这种方式呈现出来,大 多数人肯定不会满意。因为这个比例的数值太大, 难以一眼看出它们的关系。对于上面这个例子,如 果把比例记为 5:3,虽然与 真实结果有一定的误差, 但依然能够较为准确地反映调查结果,同时也显得 比较直观。
现给出支持人数 A,反对人数 B,以及一个上限 L, 请你将 A 比 B 化简为 A’比 B’,要求在 A’和 B’均 不大于 L 且 A’和 B’互质(两个整数的最大公约数 是 1)的前提下,A’/B’ ≥ A/B 且 A’/B’ - A/B 的值 尽可能小。
输入样例 2 23 ?*? *??
输出样例 2 mine.out 2*1 *21
对于 100%的数据,1≤n≤100,1≤m≤100
.,.,
10
比例简化 (noip2014普及组第二题)
在社交媒体上,经常会看到针对某一个观点同意与 否的民意调查以及结果。例如,对某 一观点表示 支持的有 1498 人,反对的有 902 人,那么赞同与 反对的比例可以简单的记为1498:902。
.,.,
11
比例简化 (noip2014普及组第二题)
输入格式 输入共一行,包含三个整数 A,B,L,每两个整

NOIP普及组历届试题分析

NOIP普及组历届试题分析

对于100%的数据,3 ≤ n ≤ 100 测验题给出的正整数大小不超过10,000。
试题分析

题意大意:给你n个数,在这n个数中,找 到满足A+B=C的C的个数,注意不是这个 等式的个数。
样例中,1,2,3,4有1+2=3,1+3=4两个。

由于本题数据规模n<=100,我们可以直接
枚举C, A, B,三层循环解决问题。
扫雷游戏 (noip2015普及组第二题)
输入样例 1 33 *?? ??? ?*? 输入样例 2 23 ?*? *??
输出样例 1 mine.out *10 221 1*1 输出样例 2 mine.out 2*1 *21
对于 100%的数据,1≤n≤100,1≤m≤100
问题分析:
本题也是简单的枚举类试题。 我们从雷区的第一行第一列(1,1)开始,判断它周围 有多少个地雷。 由于本题读入的是字符,读入时需要注意: readln(n,m); for i=1 to n do begin for j=1 to m do read(a[i][j]); readln; end;
比例简化 (noip2014普及组第二题)



在社交媒体上,经常会看到针对某一个观点同意与 否的民意调查以及结果。例如,对某 一观点表示 支持的有 1498 人,反对的有 902 人,那么赞同与 反对的比例可以简单的记为1498:902。 不过,如果把调查结果就以这种方式呈现出来,大 多数人肯定不会满意。因为这个比例的数值太大, 难以一眼看出它们的关系。对于上面这个例子,如 果把比例记为 5:3,虽然与 真实结果有一定的误差, 但依然能够较为准确地反映调查结果,同时也显得 比较直观。 现给出支持人数 A,反对人数 B,以及一个上限 L, 请你将 A 比 B 化简为 A’比 B’,要求在 A’和 B’均 不大于 L 且 A’和 B’互质(两个整数的最大公约数 是 1)的前提下,A’/B’ ≥ A/B 且 A’/B’ - A/B 的值 尽可能小。

noip普及组复赛试题及答案

noip普及组复赛试题及答案

noip普及组复赛试题及答案一、选择题1. 在计算机科学中,以下哪个概念与数据结构最相关?A. 算法B. 操作系统C. 网络协议D. 编译原理答案:A2. 以下哪种排序算法的时间复杂度为O(n^2)?A. 快速排序B. 归并排序C. 堆排序D. 冒泡排序答案:D3. 在C++中,以下哪个关键字用于定义类?A. structB. unionC. enumD. typedef答案:A4. 以下哪个选项不是数据库管理系统(DBMS)的特性?A. 数据持久性B. 数据共享C. 数据加密D. 数据独立性答案:C5. 在计算机网络中,TCP和UDP协议分别属于哪一层?A. 传输层B. 应用层C. 网络层D. 物理层答案:A二、填空题1. 在计算机程序中,______ 用于定义数据的存储方式和组织形式。

答案:数据结构2. 一个算法的时间复杂度为O(1),表示该算法的执行时间与输入数据的规模______。

答案:无关3. 在C++中,______ 是一种特殊的类,它提供了一种方式来定义数据类型。

答案:typedef4. 数据库管理系统(DBMS)通常包含数据定义语言(DDL)、数据操纵语言(DML)和______。

答案:数据控制语言(DCL)5. 在计算机网络中,______ 协议负责在网络层进行数据包的路由选择。

答案:IP三、简答题1. 请简述面向对象编程(OOP)的三个基本特征。

答案:封装、继承、多态2. 描述二分查找算法的基本步骤。

答案:二分查找算法的基本步骤包括:首先确定数组是有序的,然后取中间元素与目标值比较,如果中间元素等于目标值,则查找成功;如果目标值小于中间元素,则在左半部分继续查找;如果目标值大于中间元素,则在右半部分继续查找,直到找到目标值或查找范围为空。

四、编程题1. 编写一个函数,实现对整数数组的排序。

答案:以下是一个简单的冒泡排序算法实现:```cppvoid bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {swap(arr[j], arr[j+1]);}}}}```2. 编写一个函数,实现计算一个整数的阶乘。

NOIP2014(第二十届)初赛普及组C语言试题及答案

NOIP2014(第二十届)初赛普及组C语言试题及答案

NOIP2014(第二十届)初赛普及组C语言试题及答案第二十届全国青少年信息学奥林匹克联赛初赛普及组C语言试题竞赛时间:2014年10月12日14:30~16:30 选手注意:l 试题纸共有8页,答题纸共有2页,满分100分。

请在答题纸上作答,写在试题纸上的一律无效。

l 不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。

一、单项选择题(共20题,每题1.5分,共计30分;每题有且仅有一个正确选项)1. 以下哪个是面向对象的高级语言()。

A. 汇编语言B. C++C. FortranD. Basic 2. 1TB代表的字节数量是()。

A. 2的10次方B. 2的20次方C. 2的30次方D. 2的40次方3. 二进制数__和__的和是()。

A. __B. __0C. __D. __ 4. 以下哪一种设备属于输出设备()。

A. 扫描仪B. 键盘C. 鼠标D. 打印机5. 下列对操作系统功能的描述最为完整的是()。

A. 负责外设与主机之间的信息交换B. 负责诊断机器的故障 C. 控制和管理计算机系统的各种硬件和软件资源的使用 D. 将源程序编译成目标程序6. CPU、存储器、I/O设备是通过()连接起来的。

A. 接口B. 总线C. 控制线D. 系统文件7. 断电后会丢失数据的存储器是()。

A. RAMB. ROMC. 硬盘D. 光盘8. 以下哪一种是属于电子邮件收发的协议()。

A. SMTPB. UDPC. P2PD. FTP 9. 下列选项中不属于图像格式的是()。

A. JPEG格式B. TXT格式C. GIF格式D. PNG格式10. 链表不具有的特点是()。

A. 不必事先估计存储空间B. 可随机访问任一元素C. 插入删除不需要移动元素D. 所需空间与线性表长度成正比11. 下列各无符号十进制整数中,能用八位二进制表示的数中最大的是()。

A. 296B. 133C. 256D. 199 12. 下列几个32位IP地址中,书写错误的是()。

NOIP2014复赛普及组第一题题解

NOIP2014复赛普及组第一题题解

活动园地NOIP2014复赛普及组第一题题解原题一、题目简化:求N个正数中有多少个数是这些数中其它两个数的和。

3<=N<=100; 每个正整数M:1<=M<=10000;二、过程分析:试题显然可以分成三个步骤求解:1、先求出N个数中每两个数的和;2、判断这些和中有没有重复,重复的数只留下一个;3、N个数中的每一个数都与这些和比较,若相等些记下,比较完成,即得其解。

三、算法与策略:三个步骤都采用一一列举所有可能的方法,是典型的枚举。

四、程序设计思路:1、一维数组A存放N个数,一维数组B存放两两相加的和;求和、判断重复、比较两数是否相等,都采用两重循环,i 控制外循环,j 控制内循环,k表示数组B的下标变化,ans表示题目答案。

数组a最多100个元素,考虑到用循环,为防止下标越界,可适当把数组开大一些,a[0..101];数组b中元素数是N个数两个数两两相加的和的个数,由于N最大是100,所以和的个数最多是1+2+3+……99=4950个,则b[0..5000]五、程序设计:program count;vara:array[0..101] of longint;b:array[0..5000] of longint;n,ans,i,j,k:longint;beginassign(input,'count.in');reset(input);assign(output,'count.out');rewrite(output);readln(n);for i:=1 to n doread(a[i]);fillchar(b,sizeof(b),0);**下面开始步骤1:a中的数两两相加放在b中**k:=1;for i:=1 to n-1 dofor j:=i+1 to n dobeginb[k]:=a[i]+a[j];inc(k);end;**下面开始步骤2:筛掉b中的重复数据:**for i:= 1 to (k-1)-1 do for j:=i+1 to k-1 do begin if b[i]:=b[j] then b[j]:=0; end;**下面开始步骤3:比较a 数组中有多少个数与b 数组中的数相等:** ans:=0; for i:=1 to n dofor j:=1 to k-1 do begin if (a[i]=b[j]) then inc(ans); end;**比较结束,结果已得出,下面输出结果,关闭文件,结束程序** write(ans); close(input) close(output); end.六、时间复杂度分析:三个步骤采用了三个双重循环,每个双重循环运行约N ·∑-=11n i i 次,若N =100,则整个程序运行约150万次操作,T (N )=0(N 3)理论上讲,还可以忍受。

2014noip复赛模拟练习2(答案)

2014noip复赛模拟练习2(答案)

1.某监狱里有个很长的走廊,走廊中一个接一个地有N个房间。

每个房间中锁着一个犯人。

一天夜里,狱警决定玩一个无聊游戏。

第1轮中,他喝了一口威士忌,然后打开每个房间。

第2轮,他喝了一口威士忌,然后按2的倍数遍历每个房间。

第3轮,他又喝了一口威士忌,然后遍历所有3的倍数的房间。

依次类推。

在遍历中,如果房间是锁着的,则打开;否则锁上。

他这样重复N轮,最终醉酒。

这时有些囚犯看到自己房间的锁被打开了,他们立即逃跑。

对于有N个房间的走廊,最终会有多少囚犯逃脱?输入:输入数据的第一行中有一个整数,表示有多少组测试数据。

接下来的若干行每行包含一个值为5-100的整数,这是房间的数目。

输出:对应输入数据输出多行,每行一个整数,表示逃脱的囚犯数量。

样例输入:25100样例输出:210var n,num,s,m,i,k,j:integer;a:array[0..200]of boolean;begin readln(num);for i:=1 to num dobegin readln(n);fillchar(a,sizeof(a),true);for j:=1 to n dofor k:=1 to n doif k mod j=0 then a[k]:=not a[k];s:=0;for j:=1 to n doif a[j]=false then inc(s);writeln(s);end;end. 输入3 10 35 50输出3 5 7输入3 22 68 99 输出 4 8 9输入5 10 30 60 85 100 输出 3 5 7 9 10一个自然数,若它的素因数至少是两重的(相同的素因数至少个数为二个,如:24=2*2*2*3,则称该数为“漂亮数”。

若相邻的两个自然数都是“漂亮数”,就称它们为“孪生漂亮数”,例如8和9就是一对“孪生漂亮数”。

输入X,Y,编程找出[X,Y]之间的所有“孪生漂亮数”。

如输入2 25,则输出8 924 25var i,n,a,t,x,y,s:longint; f :boolean;begin readln(x,y);a:=x;repeata:=a+1;n:=a;f:=false; i:= 2 ;while n >= i do begint:=0;while n mod i = 0 do begint:=t+1;n := n div i;end;if t>=2 then f:=true;i := i+1;end;if f then beginn:=a+1;f:=false; i:= 2 ;while n >= i do begint:=0;while n mod i = 0 do begint:=t+1;n := n div i;end;if t>=2 then f:=true;i := i+1;end; end;if f then begin s:=s+1; writeln(a,’‘,a+1);end;until a=y;readln;end.输入50 120输出63 64 75 76 80 81 98 99 99 100 116 117 120 121 输入354 480 输出360 361 363 364 368 369 。

2014noip普及组复赛测试(答案)

2014noip普及组复赛测试(答案)

老师给笑笑布置了一份作业,笑笑不知如何解决。

老师给了一串很长的数列,要求从中找出连续的一段来使的总和最大。

【输入文件】:第一行包含一个整数n,表示数列的长度。

(n<=100000)第二行包含n个整数来描述这个数列,每个整数的的绝对值不超过1000。

【文件输出】:文件中只有一个整数,为最大的连续段总和。

【输入样例】:51 -23 1 -4【输出样例】4vars:array[1..10000] of longint;n,ii,t,ans:longint;beginreadln(n);for i:=1 to n doread(s[i]);t:=s[1];ans:=s[1];for i:=2 to n dobeginif t<0 then t:=s[i] else t:=t+s[i];if t>ans then ans:=t;end;writeln(ans);end.输入61 5 4 -2 63 输出17输入1024 -12 9 11 7 20 -8 15 3 18 输出87输入710 8 9 -5 12 6 11 输出51输入205 12 19 20 -7 -6 18 22 19 8 11 33 15 32 17 -30 4 14 24 -13输出230【问题描述】鲁宾逊先生有一只宠物猴,名叫多多。

这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。

鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。

在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。

有经验的多多一眼就能看出,每棵花生植株下的花生有多少。

为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。

”我们假定多多在每个单位时间内,可以做下列四件事情中的一件:1)从路边跳到最靠近路边(即第一行)的某棵花生植株;2)从一棵植株跳到前后左右与之相邻的另一棵植株;3)采摘一棵植株下的花生;4)从最靠近路边(即第一行)的某棵花生植株跳回路边。

NOIP2014普及组复赛解题报告

NOIP2014普及组复赛解题报告

Prolem 1 珠心算测试(count)这道题其实很简单,意思就是说给你一些数a1,a2,a3,a4...a n,然后让你回答有多少个A+B=C(A ≠ B ≠ C)满足(回答C的数量,而不是等式的数量)方法一那么有一种很明显的做法就是三层循环枚举C、A、B,注意:C是在最外层,若找到了一个A和一个B,满足上述等式,则C是一个符合要求的解,这时ans++,并且退出当前枚举,枚举下一个C,这种算法的时间复杂度是O(N3)而我当时没想到这个算法,因为有更好用而且简单更不容易出错的解法,方法二两重循环,分别枚举i=1...n,j=i+1...n,如果ai+aj这个数在集合中存在,那么you[a i+a j]←true,然后再从a1到a n做一次扫描,只要you[a i],ans++这个算法的好处在于它很好写,不用退出什么的,也不用注意循环的顺序,而且时间复杂度是O(N2)代码(方法2):在此征求一下大神的意见,如有更快的做法,敬请奉上小结:这道题很简单,但很多人没有做对的原因就是没有好好理解题意,但是根本原因其实还在于心态太骄傲了,认为是第一题就可以轻视,这样是不好的,水题我们更要做好啊,你想想同样是100分,这100分多么好拿,所以是水题、越该放平心态,细心地做。

当时我正是由于重视(2013年第一题爆零的教训),用了整整15分钟才做好,最后得了100分Problem 2 比例简化这道题目是说,给定A和B,求解一组A’和B’,满足以下条件:A′B′−AB≥00<A′,B′≤LA′和B′互质首先,想一个总体的框架:我们发现L≤100,因此可以枚举A′和B′,然后判断是否A’B’满足上述条件,并且打擂台求比值最小的一组就行了,打擂台的复杂度是O(1)。

设验证的复杂度为O(k),则总的算法的复杂度为O(kL2),其中L2是104,所以我们只要保证k的大小在100以内就一定没有问题。

现在要求两个分数的差值,该怎么办呢?高精除!很多人一下就想到了,当时我在赛场上就是这么想的,但是又仔细一考虑。

螺旋矩阵解法

螺旋矩阵解法

螺旋矩阵解法
螺旋矩阵是指按照顺时针方向,从矩阵的左上角开始,依次访问矩阵中的所有元素,形成一个螺旋形状的路径。

螺旋矩阵的解法主要有两种:模拟法和数学公式法。

一、模拟法
模拟法是根据螺旋矩阵的定义,一步一步地模拟生成螺旋矩阵的过程。

具体步骤如下:
1.初始化一个指针,指向矩阵的左上角。

2.判断指针是否指向矩阵的右下角。

如果是,则结束。

3.将指针指向的元素赋值为当前要访问的元素。

4.根据当前指针的方向,选择以下操作之一:
●如果指针指向右,则将指针向右移动一个单位,并将方向改为下。

●如果指针指向下,则将指针向左移动一个单位,并将方向改为左。

●如果指针指向左,则将指针向上移动一个单位,并将方向改为上。

●如果指针指向右,则将指针向右移动一个单位,并将方向改为下。

5.重复步骤2到4,直到指针指向矩阵的右下角。

二、数学公式法
数学公式法是利用数学公式来计算螺旋矩阵中每个元素的位置。

具体步骤如下:
1.定义一个二维数组matrix,用于存储螺旋矩阵。

2.定义一个变量i,用于指示当前要访问的元素的行号。

3.定义一个变量j,用于指示当前要访问的元素的列号。

4.定义一个变量k,用于指示当前要访问的元素的值。

5.使用以下公式计算i、j和k的值:
●i=(n-1)/2-k
●j=(n-1)/2+k
●k=min(i,j)
6.将matrix[i][j]赋值为k。

7.重复步骤2到6,直到k等于n*n-1。

noip复赛总结归纳(c++)

noip复赛总结归纳(c++)

noip复赛总结归纳(2010至2015年c++普及组复赛试题)一、【题目】1.数字统计(two.pas/c/cpp)【问题描述】请统计某个给定范围[L, R]的所有整数中,数字2 出现的次数。

比如给定范围[2, 22],数字2 在数2 中出现了1 次,在数12 中出现1 次,在数20 中出现1 次,在数21 中出现1 次,在数22 中出现2 次,所以数字2 在该范围内一共出现了6次。

【输入】输入文件名为two.in。

输入共1 行,为两个正整数L 和R,之间用一个空格隔开。

【输出】输出文件名为two.out。

输出共1 行,表示数字2 出现的次数。

【输入输出样例1】two.in two.out2 22 6【输入输出样例2】two.in two.out2 100 20【数据范围】1 ≤ L ≤ R≤ 10000。

【算法】把每一位分出来,一一判断【代码】#include<cstdio>using namespace std;int main(){int r,l,ans=0;scanf("%d%d",&r,&l);for(int i=r;i<=l;i++)//一一判断{int num=i;while(num>0)//把每一位分离{if(num%10==2)ans++;num/=10;}}printf("%d",ans);return 0;}【年份】2010二、【题目】2.接水问题(water.pas/c/cpp)【问题描述】学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。

现在有n 名同学准备接水,他们的初始接水顺序已经确定。

将这些同学按接水顺序从1到n 编号,i 号同学的接水量为wi。

接水开始时,1 到m 号同学各占一个水龙头,并同时打开水龙头接水。

当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k马上接替j 同学的位置开始接水。

noip2014普及组复赛题解

noip2014普及组复赛题解

1.珠心算测验注意看清题意:其中有多少个数,恰好等于集合中另外两个(不同的)数之和。

这样的题意加上100的规模,建议暴力3个for:#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int n;int a[105];int main(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);scanf("%d",&n);for(int i=1; i<=n; i++){scanf("%d",&a[i]);}sort(a+1,a+n+1);int res=0;for(int i=1; i<=n; i++){int ok=0;for(int j=1; j<=n && !ok; j++) if(j!=i){for(int k=1; k<=n && !ok; k++) if(a[k]!=a[j]){if(a[j]+a[k]==a[i]) ok=1;}}res+=ok;}printf("%d\n",res);return 0;}2.比例简化L很小,还是枚举,然后比较的话建议用乘法比较,避免精度问题:#include<cstdio>#include<cstring>#include<iostream>using namespace std;int A,B,L;int gcd(int a,int b){if(b==0) return a;return gcd(b,a%b);}int main(){freopen("ratio.in","r",stdin);freopen("ratio.out","w",stdout);scanf("%d%d%d",&A,&B,&L);int ba=1000000,bb=1;for(int i=1; i<=L; i++){for(int j=1; j<=L; j++){if(gcd(i,j)==1 && i*B>=j*A){if(ba*j>=bb*i){ba=i, bb=j;}}}}printf("%d %d\n",ba,bb);return 0;}3.螺旋矩阵没一圈的数量有规律的,最外面一圈(n-1)*4,然后每往里n-2,直到后要么只有一个点,要么4个点。

CSP-J (NOIP普及组) 复赛2010-2024考查内容一览表

CSP-J (NOIP普及组) 复赛2010-2024考查内容一览表

T3纪念品背包
T4加*工领奖广搜、最短路
NOIP2018普及组序号题名考查内容
T1标题统计字符串
T2龙虎斗枚举、预处理
T3摆渡车动态规划(高级) T4对称二叉树二叉树
NOIP2017普及组序号题名考查内容
T1成绩顺序结构
T2图书管理员结构体排序
T3棋盘深搜、剪枝
T4跳房子二分、动态规划
NOIP2016普及组序号题名考查内容
T1买铅笔一重循环
T2回文日期回文
T3海港大模拟、队列
T4魔法阵枚举、前缀和
NOIP2015普及组序号题名考查内容
T1金币一重循环
T2扫雷游戏二维数组
T3求和组合数学
T4推销员贪心、优先队列
NOIP2014普及组序号题名考查内容
T1珠心算测验模拟
T2比例简化枚举、gcd
T3螺旋矩阵模拟、找规律
T4子矩阵动态规划(高级)
NOIP2013普及组序号题名考查内容
T1记数问题二重循环
T2表达式求值栈
T3小朋友的数字动态规划(高级)
T4车站分级拓扑排序
NOIP2012普及组
序号题名考查内容
T1质因数分解一重循环、质数
T2寻宝模拟、取模
T3摆花背包、动态规划
T4文化之旅最短路
NOIP2011普及组
序号题名考查内容
T1数字反转进制转换
T2统计单词数字符串
T3瑞士轮归并排序
T4表达式的值动态规划(高级)、栈
NOIP2010普及组
序号题名考查内容
T1数字统计二维数组
T2接水问题模拟
T3导弹拦截贪心
T4三国游戏贪心、博弈。

2014noip复赛模拟练习5(答案)

2014noip复赛模拟练习5(答案)

小白的名次题目描述兔子小白是位数学爱好者,有一次它参加了兔界里的数学比赛,成绩公布后,小白很想知道自己的成绩到底排第几,现在请你帮它编一个程序,要求输入一个成绩,就能知道相应的名次。

注意:同分的按相同名次算,且只算一次。

输入输入共三行。

第一行:一个整数n(n<=30000)第二行:n个正整数(这些数不大于1000)。

第三行:一个整数,需要查询的分数。

输出输出共一行。

一个整数,查询成绩的名次。

样例输入730 50 80 60 20 50 6050样例输出3var a:array[0..1000] of integer;i,n ,x,y,s,max:integer;beginreadln(n);for i:=1 to 1000 do a[i]:=-1;max:=0;for i:=1 to n dobeginread(x);if x>max then max:=x;a[x]:=1;end;read(y);i:=max;while (a[i]<>y) and (i>y) dobegin dec(i); if a[i]=1 then inc(s); end;writeln(s+1);end.小s同学出去旅游啦~,小s同学住的宾馆每天早上都会提供丰盛的自助早餐,小s同学最爱吃的就是现烤的切片面包。

但是呢,宾馆的烤面包机很差,虽然说每次最多可以同时烤k块面包,但是只能烤好这些面包的一个面。

小s要想吃上好吃的面包,就需要把面包的两面都烤好。

小s同学一共想吃n块烤面包,但是小s每天都有好多景点需要游览,她不能在早餐上耽误很长时间,因此,小s同学希望你能告诉她最少需要使用几次烤面包机就可以烤好n块面包。

输入输入数据仅有一行包含两个用空格隔开的正整数n和k(n, k<=10),n表示小s同学一共要烤n块面包,k表示宾馆的烤面包机一次最多可以同时烤好k块面包的一个面。

输出仅有一行包含一个整数,表示小s同学至少要用多少次烤面包机。

2014noip复赛模拟练习18(答案)

2014noip复赛模拟练习18(答案)

1. TOM有一个无穷序列中如下:110100100010000100000。

请你帮助TOM找出在这个无穷序列中指定位置上的数字输入格式Input Format第一行一个正整数N,表示询问的次数;接下来的N行一个正整数Ai,Ai表示在序列中的位置。

输出格式Output FormatN行,每一行为0或1,表示序列第Ai位上的数字。

对于100%的数据有N<=1500000,Ai<=10^9var n,i:longint;x,z,y:int64;begin readln(n);for i:=1 to n do beginreadln(x); z:=(x-1)*2; y:=trunc(sqrt(z));if z=y*(y+1) then writeln('1') else writeln('0');end;readln;readln;end.输入 39910111输出0 0 1输入 57 1024 15 10000 4 输出1 0 0 0 12. 输入一个正整数N(1 <= N <=20)后,可以得到一个N*N的数字螺旋方阵,分别求该方阵中的主对角线与副对角线上的数字之和S,P,输出S、P的差。

例如:N=5 得到的数字螺旋方阵如下:1 2 3 4 5 其中:主对角线从左上角到右下角,得到 16 17 18 19 6 的数字之和为:S=1+17+25+21+9=73 15 24 25 20 7 副对角线从右上角到左下角,得到 14 23 22 21 8 的数字之和:P=5+19+25+23+13=85 13 12 11 10 9 S-P= - 12Input 一个正整数NOutput主对角线与副对角线上的数字之和的差。

Sample Input 5Sample Output -12var n,i,j,t,f,l,q,z:integer;s1,s2:longint;a:array[1..20,1..20] of integer;beginreadln(n);t:=1; f:=1; l:=n;i:=1;q:=1;z:=n;while t<=n*n dobegincase f of1:beginfor j:=q to z do begin a[i,j]:=t;inc(t);end;f:=2; q:=i+1;dec(l); z:=l+q-1;end;2:beginfor i:=q to z do begin a[i,j]:=t;inc(t);end;f:=3;q:=j-1; z:=q-l+1;end;3:beginfor j:=q downto z do begin a[i,j]:=t;inc(t); end;f:=4;q:=i-1;dec(l);z:=q-l+1;end;4:beginfor i:=q downto z do begin a[i,j]:=t;inc(t); end;f:=1;q:=j+1;z:=q+l-1;end;end;end;s1:=0;s2:=0;for i:=1 to n do s1:=s1+a[i,i];for i:=n downto 1 do s2:=s2+a[n-i+1,i];writeln(s1-s2);end. 输入 7 输出 -24输入 20 输出 -200 输入 12 输出-7215 输出 -1123.字母A,B,C的所有可能的组合(按字典顺序排序)是:A, AB,ABC,AC,B,BC,C每个组合都对应一个字典顺序的序号,如下所示:1A2AB3ABC4AC5B6BC7C找出某个字母组合的字典序号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NOIP2014普及组复赛试题解答
3. 螺旋矩阵
【问题描述】
一个n 行n列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。

根据经过顺序,在格子中依次填入1,2,3,…,n2,便构成了一个螺旋矩阵。

现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。

【分析】
这是个蛇形填数问题。

如果采用先枚举二维数组再找对应的元素方法,由于1 ≤n ≤30,000,需要建立一个 30,000× 30,000的二维数组,结果会发生数据溢出且超出运行内存上限(128M)。

我们可以采用类似贪吃蛇的方法,让它在N×N个方格内自外向内逐格移动,控制其向右转的方向,并计算其长度。

解法一
#include<cstdio>
using namespace std;
bool pd(int,int) ;
int i,j;
bool p;
int main()
{
int n,x,y,u,d,l,r,tot=0; // U为上边界,D为下边界,L为左边界,R为右边界;
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
scanf("%d%d%d",&n,&i,&j);
d=n;r=n;u=1;l=1; //各边界赋初值;
x=1;y=0;
p=true;
while((tot<n*n)&&p)
{
while((y<r)&&p){++y;++tot;pd(x,y);}--r;//在上侧边界上向右移动,当上侧一行的结束时,控制其右边界向左缩一列;
while((x<d)&&p){++x;++tot;pd(x,y);}--d;//在右侧边界上向下移动,当右侧一列的结束时,控制其下边界向上缩一行;
while((y>l)&&p){--y;++tot;pd(x,y);}++l;//在下侧边界上向左移动,当下侧一行的结束时,控制其左边界向右缩一列;
while((x>u+1)&&p){--x;++tot;pd(x,y);}++u;//在左侧边界上向上移动,当左侧一列的结束时,控制其上边界向下缩一行;
}
printf("%d\n",tot);
fclose(stdin);fclose(stdout);
return 0;
}
bool pd(int x,int y) //判断是否到达目的地,如果到达则停止枚举;
{
if((x==i)&&(y==j))p=false;
return p;
}
解法二:
在上一个解法中,如果遇到极端情况时,可能需要枚举达900000000次,这显然太慢了些,我们可以根据贪吃移动的特点对程序进行优化。

可以这样考虑,当贪吃蛇到每个行列的转折点时,可以先判断目的地是否在自己的正前方,如果是则只需计算当前位置到目的地的距离加上自身的长度即可;否则就计算到下一个转折点人距离,加上当前自身长度,并到达下一个转折点,同时控制所在行(或列)的边界向内侧移动;
#include<cstdio>
using namespace std;
bool pd(int,int) ;
int main()
{
int n,i,j,x,y,u,d,l,r,tot=1; // U为上边界,D为下边界,L为左边界,R为右边界;
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
scanf("%d%d%d",&n,&i,&j);
d=n;r=n;u=1;l=1; //各边界赋初值;
x=1;y=1;
bool p=true;
while(p)
{
if(p)
if(x==i) //在上侧边界线上向右移动。

如果目的地在正前方,则当前长度加上当前位置到目的地距离,结束循环;
{tot=tot+j-y;p=false;}
else //否则,当前长度加当前位置至行未的长度,同时到达右边界位置,并控制其上边界向下移动一列;
{tot=tot+r-y;y=r;++u;}
if(p)
if(y==j)
{tot=tot+i-x;p=false;}
else
{tot=tot+d-x;x=d;--r; }
if(p)
if(x==i)
{tot=tot+y-j;p=false;}
else
{tot=tot+y-l;y=l;--d; }
if(p)
if(y==j)
{tot=tot+x-i;p=false;}
else
{tot=tot+x-u;x=u;++l;}
}
printf("%d\n",tot);
fclose(stdin);fclose(stdout);
return 0;
}
解法三:
对解法二,我们还可以进行优化。

考虑到贪吃蛇总是从外围一圈圈地向目的地前进,而每一圈刚好是一个正方形,我们可以先计算外围各圈正方形的周长之和,再让贪吃蛇从目的地所在圈的左上角出发,计算其从出发地到目的地的长度就可以了。

#include<cstdio>
using namespace std;
bool pd(int,int) ;
int main()
{
int n,i,j,x,y,u,d,l,r,k,t,tot=0; // U为上边界,D为下边界,L为左边界,R为右边界;
bool p=true;
freopen("matrix.in","r",stdin);
freopen("matrix.out","w",stdout);
scanf("%d%d%d",&n,&i,&j);
x=i<n-i+1?i:n-i+1; //判定目的在哪一圈;
y=j<n-j+1?j:n-j+1;
k=x<y?x:y;
u=k;l=k;d=n-k+1;r=n-k+1; //设定各边界;
for(t=1;t<k;++t)
{tot=tot+(n-1)*4;n=n-2;} //计算在到达目的地外围所有圈的周长之和;
x=k;y=k;++tot; //进入目的地所在的那一圈,初始化出发地;
if(p)
if(x==i) //向右移动。

如果目的地在正前方,则当前长度加上当前位置到目的地距离,结束循环;
{tot=tot+j-y;p=false;}
else //否则,当前长度加当前位置至行未的长度,到达右边界位置;
{tot=tot+r-y;y=r;}
if(p)
if(y==j)
{tot=tot+i-x;p=false;}
else
{tot=tot+d-x;x=d; }
if(p)
if(x==i)
{tot=tot+y-j;p=false;}
else
{tot=tot+y-l;y=l;}
if(p)
if(y==j)
{tot=tot+x-i;p=false;}
else
{tot=tot+x-u;}
printf("%d\n",tot);
fclose(stdin);fclose(stdout);
return 0;
}。

相关文档
最新文档