noip提高组试题 Word版.docx
《noip提高组试题 Word版.docx》由会员分享,可在线阅读,更多相关《noip提高组试题 Word版.docx(17页珍藏版)》请在冰豆网上搜索。
![noip提高组试题 Word版.docx](https://file1.bdocx.com/fileroot1/2023-1/9/6bf52e0e-659e-4722-8a3a-7a6eeed35fd8/6bf52e0e-659e-4722-8a3a-7a6eeed35fd81.gif)
noip提高组试题Word版
CCF全国信息学奥林匹克联赛(NOIP2017)复赛
提高组day1
(请选手务必仔细阅读本页内容)
一.题目概况
中文题目名称
小凯的疑惑
时间复杂度
逛公园
英文题目与子目录名
math
complexity
park
可执行文件名
math
complexity
park
输入文件名
输出文件名
每个测试点时限
1秒
1秒
3秒
测试点数目
20
10
10
每个测试点分值
5
10
10
附加样例文件
有
有
有
结果比较方式
全文比较(过滤行末空格及文末回车)
题目类型
传统
传统
传统
运行内存上限
256M
256M
512M
二.提交源程序文件名
对于C++语言
对于C语言
对于pascal语言
三.编译命令(不包含任何优化开关)
对于C++语言
g++-omath
-lm
g++-ocomplexity
-lm
g++-opark
-lm
对于C语言
gcc-omath
-lm
gcc-ocomplexity
-lm
gcc-opark
-lm
对于pascal语言
fpc
fpc
fpc
注意事项:
1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:
CPUAMDAthlon(tm)IIx2240processor,,内存4G,上述时限以此配置为准。
4、只提供Linux格式附加样例文件。
5、提交的程序代码文件的放置位置请参照各省的具体要求。
6、特别提醒:
评测在当前最新公布的NOILinux下进行,各语言的编译器版本以其为准。
【问题描述】
1.小凯的疑惑
c/pas)
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。
每种金币小凯都有无数个。
在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。
现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?
注意:
输入数据保证存在小凯无法准确支付的商品。
【输入格式】
输入文件名为。
输入数据仅一行,包含两个正整数a和b,它们之间用一个空格隔开,表示小凯手中金币的面值。
【输出格式】
输出文件名为。
输出文件仅一行,一个正整数N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
【输入输出样例1】
37
11
见选手目录下的math/和math/。
【输入输出样例1说明】
小凯手中有面值为3和7的金币无数个,在不找零的前提下无法准确支付价值为1、
2、4、5、8、11的物品,其中最贵的物品价值为11,比11贵的物品都能买到,比如:
12=3*4+7*0
13=3*2+7*1
14=3*0+7*2
15=3*5+7*0
……
【输入输出样例2】
见选手目录下的math/和math/。
【数据规模与约定】
对于30%的数据:
1≤a,b≤50。
对于60%的数据:
1≤a,b≤10,000。
对于100%的数据:
1≤a,b≤1,000,000,000。
【问题描述】
2.时间复杂度
c/pas)
小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!
下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。
A++语言的循环结构如下:
Fixy
循环体
E
其中“Fixy”表示新建变量(i变量i不可与未被销毁的变量重名)并初始化为x,
然后判断i和y的大小关系,若i小于等于y则进入循环,否则不进入。
每次循环结束后i都会被修改成i+1,一旦i大于y终止循环。
x和y可以是正整数(x和y的大小关系不定)或变量n。
n是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于100。
“E”表示循环体结束。
循环体结束时,这个循环体新建的变量也被销毁。
注:
本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“Θ”的概念。
【输入格式】
输入文件名为。
输入文件第一行一个正整数t,表示有t(t≤10)个程序需要计算时间复杂度。
每个程序我们只需抽取其中“Fixy”和“E”即可计算时间复杂度。
注意:
循环结构允许嵌套。
接下来每个程序的第一行包含一个正整数L和一个字符串,L代表程序行数,字符串表示这个程序的复杂度,“O
(1)”表示常数复杂度,“O(n^w)”表示复杂度为?
?
?
?
,其中w是一个小于100的正整数(输入中不包含引号),输入保证复杂度只有O
(1)和O(n^w)两种类型。
接下来L行代表程序中循环结构中的“Fixy”或者“E”。
程序行若以“F”开头,表示进入一个循环,之后有空格分离的三个字符(串)ixy,其中i是一个小写字母(保证不为“n”),表示新建的变量名,x和y可能是正整数或n,已知若为正整数则一定小于100。
程序行若以“E”开头,则表示循环体结束。
【输出格式】
输出文件名为。
输出文件共t行,对应输入的t个程序,每行输出“Yes”或“No”或者“ERR”(输出中不包含引号),若程序实际复杂度与输入给出的复杂度一致则输出“Yes”,不一致则输出“No”,若程序有语法错误(其中语法错误只有:
①F和E不匹配②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出“ERR”。
注意:
即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出“ERR”。
【输入输出样例1】
8
2O
(1)
Fi11E
2O(n^1)
Fx1nE
1O
(1)
Fx1n4O(n^2)
Fx5nFy10nE
E
4O(n^2)
Fx9nE
Fy2nE
4O(n^1)
Fx9nFyn4E
E
4O
(1)
Fyn4Fx9nE
E
4O(n^2)
Fx1nFx110E
E
YesYesERR
YesNoYesYesERR
见选手目录下的
complexity/和complexity/。
【输入输出样例1说明】
第一个程序i从1到1是常数复杂度。
第二个程序x从1到n是n的一次方的复杂度。
第三个程序有一个F开启循环却没有E结束,语法错误。
第四个程序二重循环,n的平方的复杂度。
第五个程序两个一重循环,n的一次方的复杂度。
第六个程序第一重循环正常,但第二重循环开始即终止(因为n远大于100,100大于4)。
第七个程序第一重循环无法进入,故为常数复杂度。
第八个程序第二重循环中的变量x与第一重循环中的变量重复,出现语法错误②,输出
ERR。
【输入输出样例2】见选手目录下的
complexity/和complexity/。
【数据规模与约定】
对于30%的数据:
不存在语法错误,数据保证小明给出的每个程序的前L/2行一定为以F开头的语句,第L/2+1行至第L行一定为以E开头的语句,L<=10,若x、y均为整数,x一定小于y,且只有y有可能为n。
对于50%的数据:
不存在语法错误,L<=100,且若x、y均为整数,x一定小于y,且只有y有可能为n。
对于70%的数据:
不存在语法错误,L<=100。
对于100%的数据:
L<=100。
【问题描述】
3.逛公园
c/pas)
策策同学特别喜欢逛公园。
公园可以看成一张?
?
个点?
?
条边构成的有向图,且没有自环和重边。
其中1号点是公园的入口,?
?
号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的时间。
策策每天都会去逛公园,他总是从1号点进去,从?
?
号点出来。
策策喜欢新鲜的事物,他不希望有两天逛公园的路线完全一样,同时策策还是一个特别热爱学习的好孩子,他不希望每天在逛公园这件事上花费太多的时间。
如果1号点到?
?
号点的最短路长为?
?
,那么策策只会喜欢长度不超过?
?
+?
?
的路线。
策策同学想知道总共有多少条满足条件的路线,你能帮帮他吗?
为避免输出过大,答案对?
?
取模。
如果有无穷多条合法的路线,请输出?
1。
【输入格式】
输入文件名为。
第一行包含一个整数?
?
代表数据组数。
接下来?
?
组数据,对于每组数据:
第一行包含四个整数?
?
?
?
?
?
?
?
,每两个整数之间用一个空格隔开。
接下来?
?
行,每行三个整数?
?
?
?
?
?
?
?
?
?
?
?
,代表编号为?
?
?
?
?
?
?
?
的点之间有一条权值为?
?
?
?
的有向边,每两个整数之间用一个空格隔开。
【输出格式】
输出文件名为。
输出文件包含?
?
行,每行一个整数代表答案。
【输入输出样例1】
2
57210
121
240
452
232
341
352
153
22010
120
210
3
-1
见选手目录下的park/和park/。
对于第一组数据,最短路为3。
1–5,1–2–4–5,1–2–3–5为3条合法路径。
【输入输出样例2】
见选手目录下的park/和park/。
【数据规模与约定】
对于不同的测试点,我们约定各种参数的规模不会超过如下
测试点编号
?
?
?
?
?
?
?
?
是否有0边
1
5
5
10
0
否
2
5
1000
2000
0
否
3
5
1000
2000
50
否
4
5
1000
2000
50
否
5
5
1000
2000
50
否
6
5
1000
2000
50
是
7
5
100000
200000
0
否
8
3
100000
200000
50
否
9
3
100000
200000
50
是
10
3
100000
200000
50
是
对于100%的数据,1≤?
?
≤109,1≤?
?
?
?
?
?
?
?
≤?
?
0≤?
?
?
?
≤1000。
数据保证:
至少存在一条合法的路线。
CCF全国信息学奥林匹克联赛(NOIP2017)复赛
提高组day2
(请选手务必仔细阅读本页内容)
一.题目概况
中文题目名称
奶酪
宝藏
列队
英文题目与子目录名
cheese
treasure
phalanx
可执行文件名
cheese
treasure
phalanx
输入文件名
输出文件名
每个测试点时限
1秒
1秒
2秒
测试点数目
10
20
20
每个测试点分值
10
5
5
附加样例文件
有
有
有
结果比较方式
全文比较(过滤行末空格及文末回车)
题目类型
传统
传统
传统
运行内存上限
256M
256M
512M
二.提交源程序文件名
对于C++语言
对于C语言
对于pascal语言
三.编译命令(不包含任何优化开关)
对于C++语言
g++-ocheese
-lm
g++-otreasure
-lm
g++-ophalanx
-lm
对于C语言
gcc-ocheese
-lm
gcc-otreasure
-lm
gcc-ophalanx
-lm
对于pascal语言
fpc
fpc
fpc
注意事项:
1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:
CPUAMDAthlon(tm)IIx2240processor,,内存4G,上述时限以此配置为准。
4、只提供Linux格式附加样例文件。
5、提交的程序代码文件的放置位置请参照各省的具体要求。
6、特别提醒:
评测在当前最新公布的NOILinux下进行,各语言的编译器版本以其为准。
【问题描述】
1.奶酪
c/pas)
现有一块大奶酪,它的高度为h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。
我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z=0,奶酪的上表面为z=h。
现在,奶酪的下表面有一只小老鼠Jerry,它知道奶酪中所有空洞的球心所在的坐标。
如果两个空洞相切或是相交,则Jerry可以从其中一个空洞跑到另一个空洞,特别地,如果一个空洞与下表面相切或是相交,Jerry则可以从奶酪下表面跑进空洞;如果一个空洞与上表面相切或是相交,Jerry则可以从空洞跑到奶酪上表面。
位于奶酪下表面的Jerry想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑到奶酪的上表面去?
空间内两点?
?
1(?
?
1,?
?
1,?
?
1)、?
?
2(?
?
2,?
?
2,?
?
2)的距离公式如下:
dist(?
?
1,?
?
2)=√(?
?
1?
?
?
2)2+(?
?
1?
?
?
2)2+(?
?
1?
?
?
2)2
【输入格式】
输入文件名为。
每个输入文件包含多组数据。
输入文件的第一行,包含一个正整数T,代表该输入文件中所含的数据组数。
接下来是T组数据,每组数据的格式如下:
第一行包含三个正整数n,h和r,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。
接下来的n行,每行包含三个整数x、y、z,两个数之间以一个空格分开,表示空洞球心坐标为(?
?
?
?
?
?
)。
【输出格式】
输出文件名为。
输出文件包含T行,分别对应T组数据的答案,如果在第i组数据中,Jerry能从下表面跑到上表面,则输出“Yes”,如果不能,则输出“No”(均不包含引号)。
【输入输出样例1】
3
Yes
2
4
1
No
0
0
1
Yes
0
0
3
2
5
1
0
0
1
0
0
4
2
5
2
0
0
2
2
0
4
见选手目录下的cheese/和cheese/。
【输入输出样例1说明】
第一组数据,由奶酪的剖面图可见:
第一个空洞在(0,0,0)与下表面相切第二个空洞在(0,0,4)与上表面相切两个空洞在(0,0,2)相切
输出Yes
第二组数据,由奶酪的剖面图可见:
两个空洞既不相交也不相切
输出No
第三组数据,由奶酪的剖面图可见:
两个空洞相交
且与上下表面相切或相交输出Yes
【输入输出样例2】
见选手目录下的cheese/和cheese/。
【数据规模与约定】
对于20%的数据,n=1,1≤h,r≤10,000,坐标的绝对值不超过10,000。
对于40%的数据,1≤n≤8,1≤h,r≤10,000,坐标的绝对值不超过10,000。
对于80%的数据,1≤n≤1,000,1≤h,r≤10,000,坐标的绝对值不超过10,000。
对于100%的数据,1≤n≤1,000,1≤h,r≤1,000,000,000,T≤20,坐标的
绝对值不超过1,000,000,000。
【问题描述】
2.宝藏
(c/pas)
参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了n个深埋在地下的宝藏屋,也给出了这n个宝藏屋之间可供开发的m条道路和它们的长度。
小明决心亲自前往挖掘所有宝藏屋中的宝藏。
但是,每个宝藏屋距离地面都很远,也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路则相对容易很多。
小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。
在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。
已经开凿出的道路可以任意通行不消耗代价。
每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路所能到达的宝藏屋的宝藏。
另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏屋之间的道路无需再开发。
新开发一条道路的代价是:
这条道路的长度×从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋)。
请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代价最小,并输出这个最小值。
【输入格式】
输入文件名为。
第一行两个用空格分离的正整数n和m,代表宝藏屋的个数和道路数。
接下来m行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏屋的编号(编号为1~n),和这条道路的长度v。
【输出格式】
输出文件名为。
输出共一行,一个正整数,表示最小的总代价。
【输入输出样例1】
4
5
4
1
2
1
1
3
3
1
4
1
2
3
4
3
4
1
见选手目录下的treasure/与treasure/
【输入输出样例1说明】
小明选定让赞助商打通了1号宝藏屋。
小明开发了道路1✍2,挖掘了2号宝藏。
开发了道路1✍4,挖掘了4号宝藏。
还开发了道路4✍3,挖掘了3号宝藏。
工程总代价为:
1×1+1×1+1×2=4
(1✍2)(1✍4)(4✍3)
【样例输入输出2】
4
5
5
1
2
1
1
3
3
1
4
1
2
3
4
3
4
2
见选手目录下的treasure/与treasure/。
【输入输出样例2说明】
小明选定让赞助商打通了1号宝藏屋。
小明开发了道路1✍2,挖掘了2号宝藏。
开发了道路1✍3,挖掘了3号宝藏。
还开发了道路1✍4,挖掘了4号宝藏。
工程总代价为:
1×1+3×1+1×1=5
(1✍2)(1✍3)(1✍4)
【输入输出样例3】
见选手目录下的treasure/和treasure/。
【数据规模与约定】
对于20%的数据:
保证输入是一棵树,1≤n≤8,v≤5000且所有的v都相等。
对于40%的数据:
1≤n≤8,0≤m≤1000,v≤5000且所有的v都相等。
对于70%的数据:
1≤n≤8,0≤m≤1000,v≤5000
对于100%的数据:
1≤n≤12,0≤m≤1000,v≤500000
【问题描述】
3.列队
c/pas)
Sylvia是一个热爱学习的女孩子。
前段时间,Sylvia参加了学校的军训。
众所周知,军训的时候需要站方阵。
Sylvia所在的方阵中有n×m名学生,方阵的行数为n,列数为m。
为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中的学生从1到n×m编上了号码(参见后面的样例)。
即:
初始时,第i行第j列的学生的编号是(i?
1)×m+j。
然而在练习方阵的时候,经常会有学生因为各种各样的事情需要离队。
在一天中,一共发生了q件这样的离队事件。
每一次离队事件可以用数对(?
?
?
?
)(1≤x≤n,1≤y≤m)描述,表示第x行第y列的学生离队。
在有学生离队后,队伍中出现了一个空位。
为了队伍的整齐,教官会依次下达这样的两条指令:
1.向左看齐。
这时第一列保持不动,所有学生向左填补空缺。
不难发现在这条指令之后,空位在第x行第m列。
2.向前看齐。
这时第一行保持不动,所有学生向前填补空缺。
不难发现在这条指令之后,空位在第n行第m列。
教官规定不能有两个或更多学生同时离队。
即在前一个离队的学生归队之后,下一个学生才能离队。
因此在每一个离队的学生要归队时,队伍中有且仅有第n行第m列一个空位,这时这个学生会自然地填补到这个位置。
因为站方阵真的很无聊,所以Sylvia想要计算每一次离队事件中,离队的同学的编号是多少。
注意:
每一个同学的编号不会随着离队事件的发生而改变,在发生离队事件后方阵中同学的编号可能是乱序的。
【输入格式】
输入文件名为。
输入共q+1行。
第1行包含3个用空格分隔的正整数n,m,q,表示方阵大小是?
?
行m列,一共发生了q次事件。
接下来q行按照事件发生顺序描述了q件事件。
每一行是两个整数x,y,用一个空格分隔,表示这个离队事件中离队的学生当时排在第x行第y列。
【输出格式】
输出文件名为。
按照事件输入的顺序,每一个事件输出一行一个整数,表示这个离队事件中离队学生的编号。
【输入输出样例1】
2
2
3
1
1
1
1
2
2
4
1
2
见选手目录下的phalanx/与phalanx/。
【输入输出样例1说明】
列队的过程如上图所示,每一行描述了一个事件。
在第一个事件中,编号为1的同学离队,这时空位在第一行第一列。
接着所有同学
向左标齐,这时编号为2的同学向左移动一步,空位移动到第一行第二列。
然后所有同
学向上标齐,这时编号为4的同学向上一步,这时空位移动到第二行第二列。
最后编号
为1的同学返回填补到空位中。
【样例输入输出2】
见选手目录下的phalanx/与phalanx/。
【数据规模与约定】
数据保证每一个事件满足1≤x≤n,1≤y≤m。