noip提高组试题day1 day2Word版.docx

上传人:b****4 文档编号:4307609 上传时间:2022-11-29 格式:DOCX 页数:18 大小:155.19KB
下载 相关 举报
noip提高组试题day1 day2Word版.docx_第1页
第1页 / 共18页
noip提高组试题day1 day2Word版.docx_第2页
第2页 / 共18页
noip提高组试题day1 day2Word版.docx_第3页
第3页 / 共18页
noip提高组试题day1 day2Word版.docx_第4页
第4页 / 共18页
noip提高组试题day1 day2Word版.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

noip提高组试题day1 day2Word版.docx

《noip提高组试题day1 day2Word版.docx》由会员分享,可在线阅读,更多相关《noip提高组试题day1 day2Word版.docx(18页珍藏版)》请在冰豆网上搜索。

noip提高组试题day1 day2Word版.docx

noip提高组试题day1day2Word版

CCF全国信息学奥林匹克联赛(NOIP2017)复赛

提高组day1

(请选手务必仔细阅读本页内容)

一.题目概况

中文题目名称

小凯的疑惑

时间复杂度

逛公园

英文题目与子目录名

math

complexity

park

可执行文件名

math

complexity

park

输入文件名

math.in

complexity.in

park.in

输出文件名

math.out

complexity.out

park.out

每个测试点时限

1秒

1秒

3秒

测试点数目

20

10

10

每个测试点分值

5

10

10

附加样例文件

结果比较方式

全文比较(过滤行末空格及文末回车)

题目类型

传统

传统

传统

运行内存上限

256M

256M

512M

二.提交源程序文件名

对于C++语言

math.cpp

complexity.cpp

park.cpp

对于C语言

math.c

complexity.c

park.c

对于pascal语言

math.pas

complexity.pas

park.pas

三.编译命令(不包含任何优化开关)

对于C++语言

g++-omath

math.cpp-lm

g++-ocomplexity

complexity.cpp-lm

g++-opark

park.cpp-lm

对于C语言

gcc-omathmath.c

-lm

gcc-ocomplexity

complexity.c-lm

gcc-oparkpark.c

-lm

对于pascal语言

fpcmath.pas

fpccomplexity.pas

fpcpark.pas

注意事项:

1、文件名(程序名和输入输出文件名)必须使用英文小写。

2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。

3、全国统一评测时采用的机器配置为:

CPUAMDAthlon(tm)IIx2240processor,2.8GHz,内存4G,上述时限以此配置为准。

4、只提供Linux格式附加样例文件。

5、提交的程序代码文件的放置位置请参照各省的具体要求。

6、特别提醒:

评测在当前最新公布的NOILinux下进行,各语言的编译器版本以其为准。

【问题描述】

1.小凯的疑惑

(math.cpp/c/pas)

小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。

每种金币小凯都有无数个。

在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。

现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?

注意:

输入数据保证存在小凯无法准确支付的商品。

【输入格式】

输入文件名为math.in。

输入数据仅一行,包含两个正整数a和b,它们之间用一个空格隔开,表示小凯手中金币的面值。

【输出格式】

输出文件名为math.out。

输出文件仅一行,一个正整数N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。

【输入输出样例1】

math.in

math.out

37

11

见选手目录下的math/math1.in和math/math1.ans。

【输入输出样例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/math2.in和math/math2.ans。

【数据规模与约定】

对于30%的数据:

1≤a,b≤50。

对于60%的数据:

1≤a,b≤10,000。

对于100%的数据:

1≤a,b≤1,000,000,000。

【问题描述】

2.时间复杂度

(complexity.cpp/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”表示通常意义下“Θ”的概念。

【输入格式】

输入文件名为complexity.in。

输入文件第一行一个正整数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”开头,则表示循环体结束。

【输出格式】

输出文件名为complexity.out。

输出文件共t行,对应输入的t个程序,每行输出“Yes”或“No”或者“ERR”(输出中不包含引号),若程序实际复杂度与输入给出的复杂度一致则输出“Yes”,不一致则输出“No”,若程序有语法错误(其中语法错误只有:

①F和E不匹配②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出“ERR”。

注意:

即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出“ERR”。

【输入输出样例1】

complexity.in

complexity.out

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/complexity1.in和complexity/complexity1.ans。

【输入输出样例1说明】

第一个程序i从1到1是常数复杂度。

第二个程序x从1到n是n的一次方的复杂度。

第三个程序有一个F开启循环却没有E结束,语法错误。

第四个程序二重循环,n的平方的复杂度。

第五个程序两个一重循环,n的一次方的复杂度。

第六个程序第一重循环正常,但第二重循环开始即终止(因为n远大于100,100大于4)。

第七个程序第一重循环无法进入,故为常数复杂度。

第八个程序第二重循环中的变量x与第一重循环中的变量重复,出现语法错误②,输出

ERR。

【输入输出样例2】见选手目录下的

complexity/complexity2.in和complexity/complexity2.ans。

【数据规模与约定】

对于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.逛公园

(park.cpp/c/pas)

策策同学特别喜欢逛公园。

公园可以看成一张𝑁个点𝑀条边构成的有向图,且没有自环和重边。

其中1号点是公园的入口,𝑁号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的时间。

策策每天都会去逛公园,他总是从1号点进去,从𝑁号点出来。

策策喜欢新鲜的事物,他不希望有两天逛公园的路线完全一样,同时策策还是一个特别热爱学习的好孩子,他不希望每天在逛公园这件事上花费太多的时间。

如果1号点到𝑁号点的最短路长为𝑑,那么策策只会喜欢长度不超过𝑑+𝐾的路线。

策策同学想知道总共有多少条满足条件的路线,你能帮帮他吗?

为避免输出过大,答案对𝑃取模。

如果有无穷多条合法的路线,请输出−1。

【输入格式】

输入文件名为park.in。

第一行包含一个整数𝑇,代表数据组数。

接下来𝑇组数据,对于每组数据:

第一行包含四个整数𝑁,𝑀,𝐾,𝑃,每两个整数之间用一个空格隔开。

接下来𝑀行,每行三个整数𝑎𝑖,𝑏𝑖,𝑐𝑖,代表编号为𝑎𝑖,𝑏𝑖的点之间有一条权值为𝑐𝑖的有向边,每两个整数之间用一个空格隔开。

【输出格式】

输出文件名为park.out。

输出文件包含𝑇行,每行一个整数代表答案。

【输入输出样例1】

park.in

park.out

2

57210

121

240

452

232

341

352

153

22010

120

210

3

-1

见选手目录下的park/park1.in和park/park1.ans。

对于第一组数据,最短路为3。

1–5,1–2–4–5,1–2–3–5为3条合法路径。

【输入输出样例2】

见选手目录下的park/park2.in和park/park2.ans。

【数据规模与约定】

对于不同的测试点,我们约定各种参数的规模不会超过如下

测试点编号

𝑇

𝑁

𝑀

𝐾

是否有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

输入文件名

cheese.in

treasure.in

phalanx.in

输出文件名

cheese.out

treasure.out

phalanx.out

每个测试点时限

1秒

1秒

2秒

测试点数目

10

20

20

每个测试点分值

10

5

5

附加样例文件

结果比较方式

全文比较(过滤行末空格及文末回车)

题目类型

传统

传统

传统

运行内存上限

256M

256M

512M

二.提交源程序文件名

对于C++语言

cheese.cpp

treasure.cpp

phalanx.cpp

对于C语言

cheese.c

treasure.c

phalanx.c

对于pascal语言

cheese.pas

treasure.pas

phalanx.pas

三.编译命令(不包含任何优化开关)

对于C++语言

g++-ocheese

cheese.cpp-lm

g++-otreasure

treasure.cpp-lm

g++-ophalanx

phalanx.cpp-lm

对于C语言

gcc-ocheese

cheese.c-lm

gcc-otreasure

treasure.c-lm

gcc-ophalanx

phalanx.c-lm

对于pascal语言

fpccheese.pas

fpctreasure.pas

fpcphalanx.pas

注意事项:

1、文件名(程序名和输入输出文件名)必须使用英文小写。

2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。

3、全国统一评测时采用的机器配置为:

CPUAMDAthlon(tm)IIx2240processor,2.8GHz,内存4G,上述时限以此配置为准。

4、只提供Linux格式附加样例文件。

5、提交的程序代码文件的放置位置请参照各省的具体要求。

6、特别提醒:

评测在当前最新公布的NOILinux下进行,各语言的编译器版本以其为准。

【问题描述】

1.奶酪

(cheese.cpp/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

 

【输入格式】

输入文件名为cheese.in。

每个输入文件包含多组数据。

输入文件的第一行,包含一个正整数T,代表该输入文件中所含的数据组数。

接下来是T组数据,每组数据的格式如下:

第一行包含三个正整数n,h和r,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。

接下来的n行,每行包含三个整数x、y、z,两个数之间以一个空格分开,表示空洞球心坐标为(𝑥,𝑦,𝑧)。

【输出格式】

输出文件名为cheese.out。

输出文件包含T行,分别对应T组数据的答案,如果在第i组数据中,Jerry能从下表面跑到上表面,则输出“Yes”,如果不能,则输出“No”(均不包含引号)。

【输入输出样例1】

cheese.in

cheese.out

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/cheese1.in和cheese/cheese1.ans。

【输入输出样例1说明】

第一组数据,由奶酪的剖面图可见:

第一个空洞在(0,0,0)与下表面相切第二个空洞在(0,0,4)与上表面相切两个空洞在(0,0,2)相切

输出Yes

第二组数据,由奶酪的剖面图可见:

两个空洞既不相交也不相切

输出No

第三组数据,由奶酪的剖面图可见:

两个空洞相交

且与上下表面相切或相交输出Yes

【输入输出样例2】

见选手目录下的cheese/cheese2.in和cheese/cheese2.ans。

【数据规模与约定】

对于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.宝藏

(treasure.cpp/c/pas)

参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了n个深埋在地下的宝藏屋,也给出了这n个宝藏屋之间可供开发的m条道路和它们的长度。

小明决心亲自前往挖掘所有宝藏屋中的宝藏。

但是,每个宝藏屋距离地面都很远,也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路则相对容易很多。

小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。

在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。

已经开凿出的道路可以任意通行不消耗代价。

每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路所能到达的宝藏屋的宝藏。

另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏屋之间的道路无需再开发。

新开发一条道路的代价是:

这条道路的长度×从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋)。

请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代价最小,并输出这个最小值。

【输入格式】

输入文件名为treasure.in。

第一行两个用空格分离的正整数n和m,代表宝藏屋的个数和道路数。

接下来m行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏屋的编号(编号为1~n),和这条道路的长度v。

【输出格式】

输出文件名为treasure.out。

输出共一行,一个正整数,表示最小的总代价。

【输入输出样例1】

treasure.in

treasure.out

4

5

4

1

2

1

1

3

3

1

4

1

2

3

4

3

4

1

见选手目录下的treasure/treasure1.in与treasure/treasure1.ans

【输入输出样例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】

treasure.in

treasure.out

4

5

5

1

2

1

1

3

3

1

4

1

2

3

4

3

4

2

见选手目录下的treasure/treasure2.in与treasure/treasure2.ans。

【输入输出样例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/treasure3.in和treasure/treasure3.out。

【数据规模与约定】

对于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.列队

(phalanx.cpp/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列的学生离队。

在有学生离队后,队伍中出现了一个空位。

为了队伍的整齐

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1