当前位置:首页 >> IT认证 >> 历年提高组复赛题目(1995-2015)

历年提高组复赛题目(1995-2015)


全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

1995 NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛 分区联赛复赛试题(高中组) (上机编程,完成时间:210 分钟)
<1> 编码问题: 设有一个数组 A:ARRAY[0..N-1] OF INTEGER; 数组中存放的元素为 0~N-1 之间的整数,且 A[i]≠A[j](当 i≠j 时) 。 例如:N=6 时,有: A=(4,3,0,5,1,2) 此时,数组 A 的编码定义如下: A[0]的编码为 0; A[i]的编码为:在 A[0],A[1],?,A[i-1]中比 A[i]的值小的个数(i=1,2,?,N-1) ∴ 上面数组 A 的编码为: B=(0,0,0,3,1,2) 程序要求解决以下问题: ① 给出数组 A 后,求出其编码。 ② 给出数组 A 的编码后,求出 A 中的原数据。 <2> 灯的排列问题: 设在一排上有 N 个格子(N?20) ,若在格子中放置有不同颜色的灯,每种灯的个数记为 N1,N2,??Nk(k 表示不同颜色灯的个数) 。 放灯时要遵守下列规则: ①同一种颜色的灯不能分开; ②不同颜色的灯之间至少要有一个空位置。 例如:N=8(格子数) R=2(红灯数) B=3(蓝灯数) 放置的方法有: R-B 顺序 R R R R R R R R B R R R B B B R B B B B B B

B B B B B

B B B

B-R 顺序 B B B B B B B B B B B B B B R R R R B R R R R R

R R R

B B B

放置的总数为 12 种。 数据输入的方式为:
第 1 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

N P1(颜色,为一个字母) N1(灯的数量) P2 N2 ?? Q(结束标记,Q 本身不是灯的颜色) 程序要求:求出一种顺序的排列方案及排列总数。 <3> 设有一个四层的积木块,1~4 层积木块的数量依次为:5,6,7,8 如下图所示放置:

8 2 3

15 4

8 1

5 4

16 3

9 2

14 6

其中,给出第三层与第四层所标示的数字,并已知第三层的数据是由第四层的数据计算 出来的。 计算的方法是:第三层的某个数据 A 是由第四层相邻的两个数据 B,C 经过某种计算后 产生的: A B C 计算所用到的计算符为:+,-, ? ,且无优先级之分(自左向右计算) ,运算符最多为 2 个。 如:3+4 ? 5=35 5 ? 4+3=23 可以看出,上图中的第三层的数据是由第四层的数据用以下计算公式计算出来的: A=B ? C+B 也就是:8=2 ? 3+2,15=3 ? 4+3,??14=2 ? 6+2 程序要求: 给出第四层与第三层的数据后,将第一、二层的每块积木标上相应的数据,并输出整个 完整的积木图及计算公式。 ① 输入数据不存在出错的情况,同时也不会超过整数的范围。 ② 计算时可允许出现以下情况: A=B (即可理解为运算符的个数为零) A=B ? B+B (即全部由 B 产生) 1996

第二届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 (高中组 竞赛用时:3 小时)
1.比赛安排(20 分) 设有有 2 n(n<=6)个球队进行单循环比赛,计划在 2 n – 1 天内完成,每个队每天进行一 场比赛。设计一个比赛的安排,使在 2 n – 1 天内每个队都与不同的对手比赛。 例如 n=2 时的比赛安排: 队 1 2 3 4 比赛 1==2 3==4 一天 1==3 2==4 二天 1==4 2==3 三天 2.数制转换(20 分) 设有一个字符串 A$的结构为: A$=’m<n>p’ 其中 m 为数字串(长度<=20) ,而 n,p 均为 1 或 2 位的数字串(其中所表达的内容在 2-10 之间) 。 程序要求:从键盘上读入 A$后(不用正确性检查) ,将 A$中的数字串 m(n 进制),以 p 进制的形式输出。
第 2 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

例如:A$=’48<10>8’ 其意义为:将 10 进制数 48,转换成 8 进制数输出。 输出结果为:48<10>=60<8> 4.挖地雷(30 分) 在一个地图上有 N 个地窖(N<=20) ,每个地窖中埋有一定数量的地雷。同时,给出地窖 之间的连接路径。 例如:

V1 V5

V

2

V3

V4

[题目要求] 当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的 连接往下挖(仅能选择一条路径) ,当无连接时挖地雷工作结束。设计一个挖地雷的方案,使 某人能挖到最多的地雷。 输入格式: N: (表示地窖的个数) W1,W2,W3,……WN (表示每个地窖中埋藏的地雷数量) A12…………… . A1N 地窖之间连接路径(其中Aij=1 表示地窖 i,j A23…………..A2N 之间是否有通路:通 Aij=1,不通 Aij==0) …….. AN-1 N 输出格式: K1--K2--……….KV MAX 例如: ⑩--------⑧

(挖地雷的顺序) (挖地雷的数量)

④-----⑦-------⑥ 输出: 1 –3 -4 max=27

其输入格式为: 5 10,8,4,7,6 1 1 1 0 0 0 0 1 1 1

-5

4.砝码称重(30 分) 设有 1g、2g、3g、5g、10g、20g 的砝码各若干枚(其总重<=1000) , 要求: 输入方式:a1 a2 a3 a4 a5 a6 (表示 1g 砝码有 a1 个,2g 砝码有 a2 个,?,20g 砝码有 a6 个) 输出方式:Total=N (N 表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用 的情况) 如输入:1_1_0_0_0_0 (注:下划线表示空格) 输出:TOTAL=3 表示可以称出 1g,2g,3g 三种不同的重量。 1997

第 3 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第三届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 (高中组 竞赛用时:3 小时)
1.在 N*N 的棋盘上(1?N?10) ,填入 1,2,?,N*N 共 N*N 个数,使得任意两个相邻的 数之和为素数。 (30%) 例如:当 N=2 时,有: 其相邻数的和为素数的有: 1 2 1+2,1+4,4+3,2+3 4 3 当 N=4 时,一种可以填写的方案如下: 1 2 11 12 16 15 8 5 13 4 9 14 6 7 10 3 在这里我们约定:左上角的格子里必须填数字 1。 程序要求: 输入:N; 输出:如有多种解,则输出第一行、第一列之和为最小的排列方案;若无解,则输 出“NO! ” 。 2.代数表达式的定义如下:

字母

a b

c 例如,下面的式子是合法的代数表达式: a; a+b*(a+c); a*a/(b+c) 下面的式子是不合法的代数表达式: ab; a+a*/(b+c); 程序要求: 输入:输入一个字符串,以“; ”结束, “; ”本身不是代数表达式中字符,仅作为结 束) ; 输出:若表达式正确,则输出“OK” ;若表达式不正确,则输出“ERROR” ,及错 误类型。 错误类型约定: 1.式了中出现不允许的字符;
第 4 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

2.括号不配对; 3.其它错误。 例如:输入:a+(b); 例如:输入:a+(b+c*a;

输出:OK 输出:ERROR 2

3.骑士游历: 设有一个 n*m 的棋盘(2?n?50,2?m?50) ,如下图,在棋盘上左下角有一个中国象 棋马。 (n,m)



(1,1) 马走的规则为: (1) 马走日字; (2) 马只能向右走 即如下图如示:

任务 1:当 n,m 输入之后,找出一条从左下角到右上角的路径。 例如,输入:n=4,m=4 (4,4)

(1,1) 输出:路径的格式:(1,1)→(2,3)→(4,4)。若不存在路径,则输出‘NO’ 任务 2:当 n,m 给出之后,同时给出马起点的位置和终点的位置,试找出从起点到终点 的所有路径的数目。 例如: (n=10,m=10) , (1,5) (起点) , (3,5) (终点) 10 9 8 7 6 5 4 3 2 1

1 2 3 4 5 6 7 8 9 10 输 出:2(即由(1,5)到(3,5)共有 2 条路径) 输入格式:n,m,x1,y1,x2,y2 (分别表示 n,m,起点坐标,终点坐标) 输出格式:路径数目(若不存在从起点到终点的路径,输出 0) 1998

第四届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 (高中组 竞赛用时:3 小时)

1.火车从始发站(称为第 1 站)开出,在始发站上车的人数为 a,然后到达第 2 站,在第 2 站有人上、下车,但上、下车的人数相同,因此在第 2 站开出时(即在到达第 3 站之前) 车上的人数保持为 a 人。从第 3 站起(包括第 3 站)上、下车的人数有一定规律:上车的
第 5 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站 (第 n-1 站) ,都满足此规律。现给出的条件是:共有 N 个车站,始发站上车的人数为 a, 最后一站下车的人数是 m(全部下车) 。试问 x 站开出时车上的人数是多少? 输入:a,n,m 和 x 输出:从 x 站开出时车上的人数。 2.设有 n 个正整数(n?20) ,将它们联接成一排,组成一个最大的多位整数。 例如:n=3 时,3 个整数 13,312,343 联接成的最大整数为:34331213 又如:n=4 时,4 个整数 7,13,4,246 联接成的最大整数为:7424613 程序输入:n n 个数 程序输出:联接成的多位数 {40%} {20%}

3.著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母 代表数字。 例如: 其含义为: + L K V E L L K V E K K V E KL V V E KL KK E E KL KK KV L+L=L,L+K=K,L+V=V,L+E=E K+L=K,K+K=V,K+V=E,K+E=KL ?? E+E=KV {40%}

根据这些规则可推导出:L=0,K=1,V=2,E=3 同时可以确定该表表示的是 4 进制加法 程序输入: n(n?9)表示行数。 以下 n 行,每行包括 n 个字符串,每个字串间用空格隔开。 (字串仅有一个为‘+’号, 其它都由大写字母组成) 程序输出: ① 各个字母表示什么数,格式如:L=0,K=1,?? ② 加法运算是几进制的。 ③ 若不可能组成加法表,则应输出“ERROR! ” 1999

第五届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 (提 高 组 竞赛用时:3 小时)
第一题 拦截导弹(28 分) 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一 个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发
第 6 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统, 因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于 30000 的正整数) ,计算这套系 统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 样例: INPUT 389 207 155 300 299 170 158 65

OUTPUT 6(最多能拦截的导弹数) 2(要拦截所有导弹最少要配备的系统数)

第二题 回文数(25 分) 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。 例如:给定一个 10 进制数 56,将 56 加 65(即把 56 从右向左读) ,得到 121 是一个回文 数。 又如:对于 10 进制数 87: STEP1:87+78 = 165 STEP3:726+627 = 1353

STEP2:165+561 = 726 STEP4:1353+3531 = 4884

在这里的一步是指进行了一次 N 进制的加法,上例最少用了 4 步得到回文数 4884。 写一个程序,给定一个 N(2<=N<=10 或 N=16)进制数 M,求最少经过几步可以得到回文 数。 如果在 30 步以内(包含 30 步)不可能得到回文数,则输出“Impossible! ” 样例: INPUT N = 9 M= 87 第三题 旅行家的预算(27 分) 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空 的) 。给定两个城市之间的距离 D1、汽车油箱的容量 C(以升为单位) 、每升汽油能行驶的距 离 D2、出发点每升汽油价格 P 和沿途油站数 N(N 可以为零) ,油站 i 离出发点的距离 Di、每 升汽油价格 Pi(i=1,2,??N) 。计算结果四舍五入至小数点后两位。如果无法到达目的地, 则输出“No Solution” 。 样例: INPUT D1=275.6 C=11.9 D2=27.4 P=2.8 N=2 油站号 I 1 2 离出发点的距离 Di 102.0 220.0 每升汽油价格 Pi 2.9 2.2

OUTPUT STEP=6

OUTPUT 26.95(该数据表示最小费用) 第四题 邮票面值设计(40 分) 给定一个信封, 最多只允许粘贴 N 张邮票, 计算在给定 K (N+K?40) 种邮票的情况下 (假
第 7 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

定所有的邮票数量都足够) ,如何设计邮票的面值,能得到最大值 MAX,使在 1~MAX 之间的 每一个邮资值都能得到。 例如,N=3,K=2,如果面值分别为 1 分、4 分,则在 1 分~6 分之间的每一个邮资值都能 得到(当然还有 8 分、9 分和 12 分) ;如果面值分别为 1 分、3 分,则在 1 分~7 分之间的每 一个邮资值都能得到。可以验证当 N=3,K=2 时,7 分就是可以得到的连续的邮资最大值,所 以 MAX=7,面值分别为 1 分、3 分。 样例: INPUT N=3 K=2

OUTPUT 1 3 MAX=7

2000

提高组
问题描述

提高组复赛试题 (三小时完成 ) 题一 进制转换

(18 分)

我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处 位置的(值减1)为指数,以10为底数的幂之和的形式。例如:123可表示为 1*10 2 1 0 +2*10 +3*10 这样的形式。 与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置 的(值-1)为指数,以2为底数的幂之和的形式。一般说来,任何一个正整数R或一个负 整数-R都可以被选来作为一个数制系统的基数。如果是以R或-R为基数,则需要用到的 数码为 0,1, . . . .R-1。例如,当R=7时,所需用到的数码是0,1,2,3,4, 5和6,这与其是R或-R无关。如果作为基数的数绝对值超过10,则为了表示这些数码, 通常使用英文字母来表示那些大于9的数码。例如对16进制数来说,用A表示10,用B 表示11,用C表示12,用D表示13,用E表示14,用F表示15。 在负进制数中是用-R 作为基数,例如-15(十进制)相当于110001(-2进制) , 并且它可以被表示为2的幂级数的和数: 5 4 3 2 110001=1*(-2) +1*(-2) +0*(-2) +0*(-2) + 1 0 0*(-2) +1*(-2) 问题求解 设计一个程序, 读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进 制下的数: -R∈{-2,-3,-4, . . . ,-20} 输 入 输入的每行有两个输入数据。 第一个是十进制数N(-32768<=N<=32767) ; 第二个是负进制数的基数-R。 输 出 结果显示在屏幕上,相对于输入,应输出此负进制数及其基数,若此基数超过10,则 参照16进制的方式处理。 样 例 输入 30000 -2 -20000 -2 28800 -16 -25000 -16 输出
第 8 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

30000=11011010101110000(base -2) -20000=1111011000100000 (base -2) 28000=19180 (base -16) -25000=7FB8 (base -16) 提高组 问题描述 今年是国际数学联盟确定的“2000——世界数学年” ,又恰逢我国著名数学家华罗庚先生 诞辰 90 周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动, 你的一个好朋友 XZ 也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道 题目: 设有一个长度为 N 的数字串,要求选手使用 K 个乘号将它分成 K+1 个部分,找出一种 分法,使得这 K+1 个部分的乘积能够为最大。 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当 N=3,K=1 时会有以下两种分法: 1) 3*12=36 2) 31*2=62 这时,符合题目要求的结果是:31*2=62 现在,请你帮助你的好朋友 XZ 设计一个程序,求得正确的答案。 输 入

题二 乘积最大

(22 分)

程序的输入共有两行: 第一行共有 2 个自然数 N,K(6?N?40,1?K?6) 第二行是一个长度为 N 的数字串。





结果显示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数) 。 样 输入 4 2 1231 输出 62 提高组 问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给 定一个开头的字母,要求出以这个字母开头的最长的“龙” (每个单词都最多在“龙”中出现
第 9 页 共 113 页



题三.

单词接龙

(27 分)

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

两次) ,在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish,如果接成一条 龙则变为 beastonish,另外相邻的两部分不能存在包含关系,例如 at 和 atide 间不能相连。 输 入

输入的第一行为一个单独的整数 n (n<=20)表示单词数,以下 n 行每行有一个单词,输入 的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一 定存在. 输 出

只需输出以此字母开头的最长的“龙”的长度 样 输入 5 at touch cheat choose tact a 输出 23 (连成的“龙”为 atoucheatactactouchoose) 例 :

第 10 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

提高组

题四. 方格取数

(33 分)

问题描述 设有 N*N 的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入 数字 0。如下图所示(见样例) : A 1 2 3 向 下 4 5 6 0 0 0 0 0 1 0 0 0 0 21 0 2 0 3 0 13 0 0 0 15 4 0 0 0 14 0 0 5 0 0 7 0 0 0 6 0 6 0 0 4 0 向右 7 8 0 0 0 0 0 0 0 0 0 0 0 0

0 14 0 0 0 0 0 0 7 某人从图的左上角的 也可以向右走, B 点。 0 0 可以向下行走, 0 0 0 0 0 直到到达右下角的 0 8A 点出发, 在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0) 。 B 此人从 A 点到 B 点共走两次,试找出 2 条这样的路径,使得取得的数之和为最大。 输 入 输入的第一行为一个整数 N(表示 N*N 的方格图) ,接下来的每行有三个整数,前两个 表示位置,第三个数为该位置上所放的数。一行单独的 0 表示输入结束。 输 出 只需输出一个整数,表示 2 条路径上取得的最大的和。 样 例 输 入 8 2 3 2 6 3 5 4 4 5 2 5 6 6 3 7 2 0 0 输 出 67 2001 :

13 6 7 14 21 4 15 14 0

NOI’2001 第七届全国青少年信息学(计算机) 奥林匹克分区联赛复赛试题 提 高 组
提高组 [问题描述]

题一 一元三次方程求解

(20 分)

有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b, c,d 均为实数) ,并约定该方程存在三个不同实根(根的范围在-100 至 100 之间) ,且根与
第 11 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

根之差的绝对值?1。 要求由小到大依次在同一行输出这三个实根(根与根之间留有空格) ,并精确到小数点后 2 位。 提示:记方程 f(x)=0,若存在 2 个数 x1 和 x2,且 x1<x2, f(x1)*f(x2)<0, 则在(x1,x2)之间一定有一个根。 [样例] 输入: 1 -5 -4 20 5.00

输出:-2.00 2.00

提高组 [问题描述]

题二 数的划分

(20 分)

将整数 n 分成 k 份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输入:n,k (6<n?200,2?k?6) 输出:一个整数,即不同的分法。 [ 样例 ]: 输入: 7 输出: 4

3 { 4 种分法为:1,1,5;1,2,4;1,3,3; 2,2,3 说明部分不必输出 }

提高组 [问题描述]

题三 统计单词个数

(30 分)

给出一个长度不超过 200 的由小写英文字母组成的字母串(约定:该字串以每行 20 个 字母的方式输入,且保证每行一定为 20 个) 。要求将此字母串分成 k 份(1<k?40) , 且每 份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之 后,其第一个字母不能再用。例如字符串 this 中可以包含 this 和 is ,选用 this 之后就不能包 含 th) 。 单词在给出的一个不超过 6 个单词的字典中。 要求输出最大的个数。 [输入格式] 全部输入数据放在文本文件 input3.dat 中, 其格式如下: 第一行为一个正整数(0<n?5)表示有 n 组测试数据 每组的第一行有二个正整数: (p,k) p 表示字串的行数; k 表示分为 k 个部分。 接下来的 p 行,每行均有 20 个字符。 再接下来有一个正整数 s,表示字典中单词个数。 (1?s?6)
第 12 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

接下来的 s 行,每行均有一个单词。 [输出格式] 结果输出至屏幕,每行一个整数,分别对应每组测试数据的相应结果。 [样例]

输入:1
1 3 thisisabookyouareaoh 4 is a ok sab 输出: //说明: (不必输出) 7 // this/ isabook youa /reaoh

第 13 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

提高组 题四 Car 的旅行路线 (30 分) [问题描述] 又到暑假了,住在城市 A 的 Car 想和朋友一起去城市 B 旅游。她知道每个城市都有四个 飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁 路,第 i 个城市中高速铁路的单位里程价格为 Ti,任意两个不同城市的机场之间均有航线, 所有航线单位里程的价格均为 t。 图例 Y 机场 高速铁路 飞机航线 注意: 图中并没有标出所有 的铁路与航线。

那么 Car 应如何安排到城市 B 的路线才能尽可能的节省花费呢?她发现这并不是一个简 单的问题,于是她来向你请教。 X [任务] 找出一条从城市 A 到 B 的旅游路线,出发和到达城市中的机场可以任意选取,要求总的 花费最少。 输入文件:键盘输入文件名 输 出:到屏幕(输出最小费用,小数点后保留 2 位。 )

输入格式
第一行为一个正整数 n(0?n?10) ,表示有 n 组测试数据。 每组的第一行有四个正整数 s,t,A,B。 S (0<S?100)表示城市的个数, t 表示飞机单位里程的价格, A,B 分别为城市 A, B 的序号, ( 1 ? A , B ? S) 。 接下来有 S 行, 其中第 i 行均有 7 个正整数 xi1 , yi1 , xi2 , yi2 , xi3 , yi3 , Ti , 这当中的 ( xi1 , yi1 ) , ( xi2 , yi2 ) , ( xi3 , yi3 )分别是第 i 个城市中任意三个机场的坐标, Ti 为第 i 个城市 高速铁路单位里程的价格。

输出格式:
共有 n 行,每行一个数据对应测试数据。 [样 例 ]:

输入
1 3 10 1 3 1 1 1 3 3 1 30 2574521 8 6 8 8 11 6 3 输出 : 47.55 提高组 题四 修公路 (30 分) [问题描述] 在一个平面的地图上有 A,B 两个城市,同时在该平面上划出若干个矩形区域(个数? 10) ,这些区域不重合,也不包含 A,B。如下图所示。 x R P A 矩形的边平行于坐标轴。 S B Q T

y
第 14 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

现准备从 A 到 B 修建一条公路, 当公路穿过某个区域时, 可以直接通过某个区域的顶点, 也可以穿过区域的边。如上图中的路径都是合法的: 平面上与每个矩形区域(包括边界)的公路单位造价不相同。在不同区域之间选用平面 造价,在同一个区域内(包括边界)选用该区域的造价。 [问题所求] 选择一条路径,使能得到最小的修建费用。 [输入格式] 全部输入数据放在文本文件 input4.dat 中, 其格式如下: 第一行为一个正整数(0<n?10)表示有 n 组测试数据 每组的第一行分别有五个正整数:AX,AY,BX,BY 及 T; AX,AY 表示 A 点坐标,BX,BY 表示 B 点坐标,T 表示平面上的单位造价; 第二行一个正整数 S,表示矩形的个数; 接下来有 S 行,每行均有 5 个正整数,分别表示一个矩形区域的左下角,右上角的 坐标以及该区域的造价。 [输出格式] n 个表示最小造价的数(精确到小数点后 2 位),每行一个数据。 [样例]

输入:
1 1 2 2 5 2 2 1 5 4 7 5 4 4 13 8 6

输出:
54.01

2002

2002 年全国青少年信息学(计算机) 奥林匹克分区联赛复赛提高组试题
题一 均分纸牌(存盘名 NOIPG1) [问题描述] 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编 号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可 以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6 移动 3 次可达到目的: 从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 11 10 10)-> 从 ② 取 1 张牌放到①(10 10 10 10) 。 [输 入]: 键盘输入文件名。文件格式: N(N 堆纸牌,1 <= N <= 100)
第 15 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000) [输 出]: 输出至屏幕。格式为: 所有堆均达到相等时的最少移动次数。‘ [输入输出样例] a.in: 4 9 8 17 6 屏慕显示: 3 题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多 6 个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$ 中的子串 A1$ 可以变换为 B1$ 、 A2$ 可以变换为 B2$ ?。 例如:A$='abcd' B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为: ‘abcd’->‘xud’->‘xy’->‘xyz’ 共进行了三次变换,使得 A$ 变换为 B$。 [输入]: 键盘输人文件名。文件格式如下: A$ B$ A1$ B1$ \ A2$ B2$ |-> 变换规则 ... ... / 所有字符串长度的上限为 20。 [输出]: 输出至屏幕。格式如下: 若在 10 步(包含 10 步)以内能将 A$ 变换为 B$ ,则输出最少的变换步 数;否则输出"NO ANSWER!" [输入输出样例] b.in: abcd xyz abc xu ud y y yz 屏幕显示: 3 题三 自由落体(存盘名:NOIPG3) [问题描述]: 在高为 H 的天花板上有 n 个小球, 体积不计, 位置分别为 0, 1, 2, ?. n-1。
第 16 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离 计算公式为 d=1/2*g*(t^2), 其中 g=10, t 为下落时间。 地面上的小车以速度 V 前进。 如下图:

小车与所有小球同时开始运动,当小球距小车的距离 <= 0.00001 时,即认 为小球被小车接受(小球落到地面后不能被接受)。 请你计算出小车能接受到多少个小球。 [输入]: 键盘输人: H,S1,V,L,K,n (l<=H,S1,V,L,K,n <=100000) [输出]: 屏幕输出: 小车能接受到的小球个数。 [输入输出样例] [输入]: 5.0 9.0 5.0 2.5 1.8 5 [输出]: 1 题四 矩形覆盖(存盘名 NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示。例如:当 n =4 时,4 个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0, 7),见图一。

这些点可以用 k 个矩形 (1<=k<=4) 全部覆盖, 矩形的边平行于坐标轴。 当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4。问题是当 n 个 点坐标和 k 给出后, 怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢。
第 17 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为 0。各个矩形必须完全分开(边线与顶点也都不能重合)。 [输入]: 键盘输人文件名。文件格式为 n k xl y1 x2 y2 ... ... xn yn (0<=xi,yi<=500) [输出]: 输出至屏幕。格式为: 一个整数,即满足条件的最小的矩形面积之和。 [输入输出样例] d.in : 4 2 1 1 2 2 3 6 0 7 屏幕显示: 4
2003

第九届全国青少年信息学奥林匹克联赛(N0IP2003)
2003 年 11 月 29 日 提高组试题 三小时完成

题一

神经网络

【问题背景】 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统, 在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是 当今的热门方向,兰兰同学在自学了一本神经网络的入门书籍后,提出了一个简化模型,他 希望你能帮助他用程序检验这个神经网络模型的实用性。 【问题描述】 在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经 元之间至多有一条边相连,下图是一个神经元的例子:

神经元〔编号为 1) 图中,X1—X3 是信息输入渠道,Y1-Y2 是信息输出渠道,C1 表示神经元目前的状态, Ui 是阈值,可视为神经元的一个内在参数。
第 18 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

神经元按一定的顺序排列,构成整个神经网络。在兰兰的模型之中,神经网络中的神 经无分为几层;称为输入层、输出层,和若干个中间层。每层神经元只向下一层的神经元 输出信息,只从上一层神经元接受信息。下图是一个简单的三层神经网络的例子。

兰兰规定,Ci 服从公式: (其中 n 是网络中所有神经元的数目)

Ci ?

公式中的 Wji(可能为 负值)表示连接 j 号神经元和 i 号神经 元的边的权值。当 Ci 大于 0 时,该神经元处于兴奋状态,否则就处于平静状态。当神经元 处于兴奋状态时,下一秒 它会向其他神经元传送信号,信号的强度为 Ci。 如此.在输入层神经元被激发之后,整个网络系统就在信息传输的推动下进行运作。 现在,给定一个神经网络,及当前输入层神经元的状态(Ci) ,要求你的程序运算出最后网 络输出层的状态。 【输入格式】 输入文件第一行是两个整数 n(1≤n≤200)和 p。接下来 n 行,每行两个整数,第 i+1 行 是神经元 i 最初状态和其阈值(Ui) ,非输入层的神经元开始时状态必然为 0。再下面 P 行, 每行由两个整数 i,j 及一个整数 Wij,表示连接神经元 i、j 的边权值为 Wij。 【输出格式】 输出文件包含若干行,每行有两个整数,分别对应一个神经元的编号,及其最后的状 态,两个整数间以空格分隔。仅输出最后状态非零的输出层神经元状态,并且按照编号由 小到大顺序输出! 若输出层的神经元最后状态均为 0,则输出 NULL。 【输入样例】 56 10 10 01 01 01 131 141 151 231 241 251 【输出样例】 31 41 51
第 19 页 共 113 页

( j,i )?E

?W C
ji

j

? Ui

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

题二

侦探推理

【问题描述】 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学 玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明 明不知情的情况下) ,明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学,被询 问者可能会说:

证词中出现的其他话,都不列入逻辑推理的内容。 明明所知道的是,他的同学中有 N 个人始终说假话,其余的人始终说真。 现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一 个! 【输入格式】 输入由若干行组成,第一行有二个整数,M(1≤M≤20) 、N(1≤N≤M)和 P(1≤P≤100) ; M 是参加游戏的明明的同学数,N 是其中始终说谎的人数,P 是证言的总数。接下来 M 行, 每行是明明的一个同学的名字(英文字母组成,没有主格,全部大写) 。 往后有 P 行,每行开始是某个同学的名宇,紧跟着一个冒号和一个空格,后面是一句证 词,符合前表中所列格式。证词每行不会超过 250 个字符。 输入中不会出现连续的两个空格,而且每行开头和结尾也没有空格。 【输出格式】 如果你的程序能确定谁是罪犯,则输出他的名字;如果程序判断出不止一个人可能是 罪犯,则输出 Cannot Determine;如果程序判断出没有人可能成为罪犯,则输出 Impossible。 【输入样例】 315 MIKE CHARLES KATE MIKE:I am guilty. MIKE:Today is Sunday. CHARLES:MIKE is guilty. KATE:I am guilty. KATE:How are you?? 【输出样例】 MIKE

题三

加分二叉树

【问题描述】 设一个 n 个节点的二叉树 tree 的中序遍历为(l,2,3,…,n) ,其中数字 1,2,3,…,n 为节点编 号。每个节点都有一个分数(均为正整数) ,记第 j 个节点的分数为 di,tree 及它的每个子树 都有一个加分,任一棵子树 subtree(也包含 tree 本身)的加分计算方法如下: subtree 的左子树的加分× subtree 的右子树的加分+subtree 的根的分数 若某个子树为主,规定其加分为 1,叶子的加分就是叶节点本身的分数。不考虑它的空
第 20 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

子树。 试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树 tree。要求输出; (1)tree 的最高加分 (2)tree 的前序遍历 【输入格式】 第 1 行:一个整数 n(n<30) ,为节点个数。 第 2 行:n 个用空格隔开的整数,为每个节点的分数(分数<100) 。 【输出格式】 第 1 行:一个整数,为最高加分(结果不会超过 4,000,000,000) 。 第 2 行:n 个用空格隔开的整数,为该树的前序遍历。 【输入样例】 5 5 7 1 2 10 【输出样例】 145 31245

题四

传染病控制

【问题背景】 近来,一种新的传染病肆虐全球。蓬莱国也发现了零星感染者,为防止该病在蓬莱国 大范围流行,该国政府决定不惜一切代价控制传染病的蔓延。不幸的是,由于人们尚未完 全认识这种传染病,难以准确判别病毒携带者,更没有研制出疫苗以保护易感人群。于是, 蓬莱国的疾病控制中心决定采取切断传播途径的方法控制疾病传播。经过 WHO(世界卫 生组织)以及全球各国科研部门的努力,这种新兴传染病的传播途径和控制方法已经研究 消楚,剩下的任务就是由你协助蓬莱国疾控中心制定一个有效的控制办法。 【问题描述】 研究表明,这种传染病的传播具有两种很特殊的性质; 第一是它的传播途径是树型的,一个人 X 只可能被某个特定的人 Y 感染,只要 Y 不 得病,或者是 XY 之间的传播途径被切断,则 X 就不会得病。 第二是,这种疾病的传播有周期性,在一个疾病传播周期之内,传染病将只会感染一 代患者,而不会再传播给下一代。 这些性质大大减轻了蓬莱国疾病防控的压力,并且他们已经得到了国内部分易感人群 的潜在传播途径图(一棵树) 。但是,麻烦还没有结束。由于蓬莱国疾控中心人手不够,同 时也缺乏强大的技术,以致他们在一个疾病传播周期内,只能设法切断一条传播途径,而 没有被控制的传播途径就会引起更多的易感人群被感染(也就是与当前已经被感染的人有 传播途径相连,且连接途径没有被切断的人群) 。当不可能有健康人被感染时,疾病就中止 传播。所以,蓬莱国疾控中心要制定出一个切断传播途径的顺序,以使尽量少的人被感染。 你的程序要针对给定的树,找出合适的切断顺序。 【输入格式】 输入格式的第一行是两个整数 n(1≤n≤300)和 p。接下来 p 行,每一行有两个整数 i 和 j,表示节点 i 和 j 间有边相连(意即,第 i 人和第 j 人之间有传播途径相连) 。其中节点 1 是已经被感染的患者。 【输出格式】 只有一行,输出总共被感染的人数。 【输入样例】 76
第 21 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

12 13 24 25 36 37 【输出样例】 3 2004

第十届全国青少年信息学奥林匹克联赛复赛试题
( 提高组 三小时完成 )

津津的储蓄计划
(save.pas/dpr/c/cpp)
【问题描述】 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 元钱,津津会预算这个 月的花销,并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末 她会加上 20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零 花钱后,如果她预计到这个月的月末手中还会有多于 100 元或恰好 100 元,她就会把整百的 钱存在妈妈那里,剩余的钱留在自己手中。 例如 11 月初津津手中还有 83 元, 妈妈给了津津 300 元。 津津预计 11 月的花销是 180 元, 那么她就会在妈妈那里存 200 元, 自己留下 183 元。 到了 11 月月末, 津津手中会剩下 3 元钱。 津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能 在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现 这种情况,津津将不得不在这个月省吃俭用,压缩预算。 现在请你根据 2004 年 1 月到 12 月每个月津津的预算,判断会不会出现这种情况。如果 不会,计算到 2004 年年末,妈妈将津津平常存的钱加上 20%还给津津之后,津津手中会有多 少钱。 【输入文件】 输入文件 save.in 包括 12 行数据,每行包含一个小于 350 的非负整数,分别表示 1 月到 12 月津津的预算。 【输出文件】 输出文件 save.out 包括一行,这一行只包含一个整数。如果储蓄计划实施过程中出现某 个月钱不够用的情况,输出-X,X 表示出现这种情况的第一个月;否则输出到 2004 年年末津 津手中会有多少钱。 【样例输入 1】 290 230 280 200 300
第 22 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

170 340 50 90 80 200 60 【样例输出 1】 -7 【样例输入 2】 290 230 280 200 300 170 330 50 90 80 200 60 【样例输出 2】 1580

第 23 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

合并果子
(fruit.pas/dpr/c/cpp)
【问题描述】 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的 堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。 可以看出,所有的果子经过 n-1 次合并之后,就只剩下一堆了。多多在合并果子时总共消耗 的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假 定每个果子重量都为 1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并 的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。 例如有 3 种果子,数目依次为 1,2,9。可以先将 1、2 堆合并,新堆数目为 3,耗费体 力为 3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12,耗费体力为 12。所 以多多总共耗费体力=3+12=15。可以证明 15 为最小的体力耗费值。 【输入文件】 输入文件 fruit.in 包括两行, 第一行是一个整数 n (1 <= n <= 30000) , 表示果子的种类数。 第二行包含 n 个整数,用空格分隔,第 i 个整数 ai(1 <= ai <= 20000)是第 i 种果子的数目。 【输出文件】 输出文件 fruit.out 包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入 数据保证这个值小于 231。 【样例输入】 3 129 【样例输出】 15 【数据规模】 对于 30%的数据,保证有 n <= 100; 对于 50%的数据,保证有 n <= 5000; 对于全部的数据,保证有 n <= 30000。

第 24 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

合唱队形
(chorus.pas/dpr/c/cpp)
【问题描述】 N 位同学站成一排, 音乐老师要请其中的(N-K)位同学出列, 使得剩下的 K 位同学排成合 唱队形。 合唱队形是指这样的一种队形:设 K 位同学从左到右依次编号为 1, 2, …, K,他们的身 高分别为 T1, T2, …, TK,则他们的身高满足 T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。 你的任务是,已知所有 N 位同学的身高,计算最少需要几位同学出列,可以使得剩下的 同学排成合唱队形。 【输入文件】 输入文件 chorus.in 的第一行是一个整数 N(2 <= N <= 100) ,表示同学的总数。第一行 有 n 个整数,用空格分隔,第 i 个整数 Ti(130 <= Ti <= 230)是第 i 位同学的身高(厘米) 。 【输出文件】 输出文件 chorus.out 包括一行,这一行只包含一个整数,就是最少需要几位同学出列。 【样例输入】 8 186 186 150 200 160 130 197 220 【样例输出】 4 【数据规模】 对于 50%的数据,保证有 n <= 20; 对于全部的数据,保证有 n <= 100。

第 25 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

虫食算
(alpha.pas/dpr/c/cpp)
【问题描述】 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判 定被啃掉的字母。来看一个简单的例子: 43#98650#45 + 8468#6633 44445506978 其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是 5 和 3,第二行的数字是 5。 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算。这里的加法是 N 进制加法,算式中三个数都有 N 位, 允许有前导的 0。 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的。我们将相同的数字用 相同的字母表示,不同的数字用不同的字母表示。如果这个算式是 N 进制的,我们就取英文 字母表中的前 N 个大写字母来表示这个算式中的 0 到 N-1 这 N 个不同的数字(但是这 N 个 字母并不一定顺序地代表 0 到 N-1) 。输入数据保证 N 个字母分别至少出现一次。 BADC + CBDA DCCC 上面的算式是一个 4 进制的算式。很显然,我们只要让 ABCD 分别代表 0123,便可以让 这个式子成立了。你的任务是,对于给定的 N 进制加法算式,求出 N 个不同的字母分别代表 的数字,使得该加法算式成立。输入数据保证有且仅有一组解。 【输入文件】 输入文件 alpha.in 包含 4 行。第一行有一个正整数 N(N <= 26) ,后面的 3 行每行有一 个由大写字母组成的字符串,分别代表两个加数以及和。这 3 个字符串左右两端都没有空格, 从高位到低位,并且恰好有 N 位。 【输出文件】 输出文件 alpha.out 包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的: 输出 N 个数字,分别表示 A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不 能有多余的空格。 【样例输入】 5 ABCED BDACE EBBAA 【样例输出】 10342 【数据规模】 对于 30%的数据,保证有 N <= 10;
第 26 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

对于 50%的数据,保证有 N <= 15; 对于全部的数据,保证有 N <= 26。 2005 第十一届全国青少年奥林匹克信息学联赛复赛提高组试题

(提高组 三小时完成)

谁拿了最多奖学金
(scholar.pas/c/cpp) 【问题描述】 某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条 件各自不同: 1) 院士奖学金,每人 8000 元,期末平均成绩高于 80 分(>80) ,并且在本学期内发表 1 篇或 1 篇以上论文的学生均可获得; 2) 五四奖学金,每人 4000 元,期末平均成绩高于 85 分(>85) ,并且班级评议成绩高于 80 分(>80)的学生均可获得; 3) 成绩优秀奖,每人 2000 元,期末平均成绩高于 90 分(>90)的学生均可获得; 4) 西部奖学金,每人 1000 元,期末平均成绩高于 85 分(>85)的西部省份学生均可获 得; 5) 班级贡献奖,每人 850 元,班级评议成绩高于 80 分(>80)的学生干部均可获得; 只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得 多项奖学金。例如姚林的期末平均成绩是 87 分,班级评议成绩 82 分,同时他还是一位学生 干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是 4850 元。 现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能 满足获得奖学金的条件) 。 【输入文件】 输入文件 scholar.in 的第一行是一个整数 N(1 <= N <= 100) ,表示学生的总数。接下来 的 N 行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否 是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长 度不超过 20 的字符串(不含空格) ;期末平均成绩和班级评议成绩都是 0 到 100 之间的整数 (包括 0 和 100) ;是否是学生干部和是否是西部省份学生分别用一个字符表示,Y 表示是, N 表示不是;发表的论文数是 0 到 10 的整数(包括 0 和 10) 。每两个相邻数据项之间用一个 空格分隔。 【输出文件】
第 27 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

输出文件 scholar.out 包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学 生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文 件中出现最早的学生的姓名。第三行是这 N 个学生获得的奖学金的总数。 【样例输入】 4 YaoLin 87 82 Y N 0 ChenRuiyi 88 78 N Y 1 LiXin 92 88 N N 0 ZhangQin 83 87 Y N 1 【样例输出】 ChenRuiyi 9000 28700

过河
(river.pas/c/cpp) 【问题描述】 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石 子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可 以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,??,L(其中 L 是桥的长 度) 。坐标为 0 的点表示桥的起点,坐标为 L 的点表示桥的终点。青蛙从桥的起点开始,不停 的向终点方向跳跃。一次跳跃的距离是 S 到 T 之间的任意正整数(包括 S,T) 。当青蛙跳到或 跳过坐标为 L 的点时,就算青蛙已经跳出了独木桥。 题目给出独木桥的长度 L,青蛙跳跃的距离范围 S,T,桥上石子的位置。你的任务是确定 青蛙要想过河,最少需要踩到的石子数。 【输入文件】 输入文件 river.in 的第一行有一个正整数 L(1 <= L <= 109) ,表示独木桥的长度。第二行 有三个正整数 S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数, 其中 1 <= S <= T <= 10, 1 <= M <= 100。 第三行有 M 个不同的正整数分别表示这 M 个石子在 数轴上的位置 (数据保证桥的起点和终点处没有石子) 。 所有相邻的整数之间用一个空格隔开。 【输出文件】 输出文件 river.out 只包括一个整数,表示青蛙过河最少需要踩到的石子数。 【样例输入】
第 28 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

10 2 3 5 23567
【样例输出】

2
【数据规模】 对于 30%的数据,L <= 10000; 对于全部的数据,L <= 109。

篝火晚会
(fire.pas/c/cpp) 【问题描述】 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小 教官” 。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有 n 个同学,编 号从 1 到 n。一开始,同学们按照 1,2,??,n 的顺序坐成一圈,而实际上每个人都有两 个最希望相邻的同学。如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意 愿,成为摆在佳佳面前的一大难题。 佳佳可向同学们下达命令,每一个命令的形式如下: (b1, b2,... bm -1, bm) 这里 m 的值是由佳佳决定的,每次命令 m 的值都可以不同。这个命令的作用是移动编号 是 b1,b2,?? bm –1,bm 的这 m 个同学的位置。要求 b1 换到 b2 的位置上,b2 换到 b3 的位置 上,??,要求 bm 换到 b1 的位置上。 执行每个命令都需要一些代价。我们假定如果一个命令要移动 m 个人的位置,那么这个 命令的代价就是 m。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗? 【输入文件】 输入文件 fire.in 的第一行是一个整数 n(3 <= n <= 50000) ,表示一共有 n 个同学。其后 n 行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是 1 的同学最希望相邻的 两个同学的编号,编号是 2 的同学最希望相邻的两个同学的编号,??,编号是 n 的同学最 希望相邻的两个同学的编号。 【输出文件】 输出文件 fire.out 包括一行,这一行只包含一个整数,为最小的总代价。如果无论怎么调 整都不能符合每个同学的愿望,则输出-1。 【样例输入】

第 29 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

4 34 43 12 12 【样例输出】 2 【数据规模】 对于 30%的数据,n <= 1000; 对于全部的数据,n <= 50000。

等价表达式
(equal.pas/c/cpp) 【问题描述】 明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题 目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达 式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。 这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机 来解决这个问题。假设你是明明,能完成这个任务吗? 这个选择题中的每个表达式都满足下面的性质: 1. 表达式只可能包含一个变量‘a’ 。 2. 表达式中出现的数都是正整数,而且都小于 10000。 3. 表达式中可以包括四种运算‘+’ (加) , ‘-’ (减) , ‘*’ (乘) , ‘^’ (乘幂) ,以及小 括号‘(’ , ‘)’ 。小括号的优先级最高,其次是‘^’ ,然后是‘*’ ,最后是‘+’和‘-’ 。 ‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。 (注意:运算符 ‘+ ’ , ‘-’ , ‘*’ , ‘^’以及小括号‘(’ , ‘)’都是英文字符) 4. 幂指数只可能是 1 到 10 之间的正整数(包括 1 和 10) 。 5. 表达式内部,头部或者尾部都可能有一些多余的空格。 下面是一些合理的表达式的例子: ((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9?? 【输入文件】 输入文件 equal.in 的第一行给出的是题干中的表达式。第二行是一个整数 n(2 <= n <= 26) ,表示选项的个数。后面 n 行,每行包括一个选项中的表达式。这 n 个选项的标号分别是 A,B,C,D?? 输入中的表达式的长度都不超过 50 个字符, 而且保证选项中总有表达式和题干中的表达 式是等价的。
第 30 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输出文件】 输出文件 equal.out 包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中 的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。 【样例输入】 ( a + 1) ^2 3 (a-1)^2+4*a a + 1+ a a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a 【样例输出】 AC 【数据规模】 对于 30%的数据,表达式中只可能出现两种运算符‘+’和‘-’ ; 对于其它的数据,四种运算符‘+’ , ‘-’ , ‘*’ , ‘^’在表达式中都可能出现。 对于全部的数据,表达式中都可能出现小括号‘(’和‘)’ 。 2006

第十二届全国青少年信息学奥林匹克 联赛复赛试题
(NOIP2006 提高组) 竞赛时间:2006 年 11 月 18 日上午 8:30—11:30
试题名称 目录 输入文件 名 输出文件 名 试题类型 附加文件 时限 energy energy energy.in energy.out 非交互式程序 题 无 1秒 无 1秒 无 1秒 无 1秒 budget budget budget.in budget.out 非交互式程序题 jsp jsp jsp.in jsp.out 非交互式程序题 digital digital digital.in digital.out 非交互式程序题

关于竞赛中不同语言使用限制的说明
第 31 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

一.关于使用 Pascal 语言与编译结果的说明 1.对于 Pascal 语言的程序,当使用 IDE 和 fpc 编译结果不一致时,以 fpc 的编译结果为准。 2.允许使用数学库(uses math 子句),以及 ansistring。但不允许使用编译开关(最后测试时 pascal 的范围检查开关默认关闭:{$R-,Q-,S-}) ,也不支持与优化相关的选项。 二.关于 C++语言中模板使用的限制说明 1.允许使用的部分: 标准容器中的布尔集合,迭代器,串,流。 相关的头文件:<bitset > <iterator > <string > <iostream > 2.禁止使用的部分: 序列:vector,list,deque 序列适配器:stack, queue, priority_queue 关联容器:map, multimap, set, multiset 拟容器:valarray 散列容器:hash_map, hash_set, hash_multimap, hash_multiset 所有的标准库算法 相关头文件:<vector > <list > <deque > <stack > <map > <set > <algorithm >

第 32 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

1.能量项链
(energy.pas/c/cpp) 【问题描述】 在 Mars 星球上,每个 Mars 人都随身佩带着一串能量项链。在项链上有 N 颗能量珠。 能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两 颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸 盘是 Mars 人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出 可以被吸盘吸收的能量。如果前一颗能量珠的头标记为 m,尾标记为 r,后一颗能量珠的头 标记为 r,尾标记为 n,则聚合后释放的能量为 m ? r ? n (Mars 单位) ,新产生的珠子的头 标记为 m,尾标记为 n。 需要时,Mars 人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下 一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,使 一串项链释放出的总能量最大。 例如:设 N=4,4 颗珠子的头标记与尾标记依次为(2,3) (3,5) (5,10) (10,2)。 我们用记号⊕表示两颗珠子的聚合操作, (j⊕k)表示第 j, k 两颗珠子聚合后所释放的能量。 则第 4、1 两颗珠子聚合后释放的能量为: (4⊕1)=10*2*3=60。 这一串项链可以得到最优值的一个聚合顺序所释放的总能量为 ((4⊕1)⊕2)⊕3)=10*2*3+10*3*5+10*5*10=710。 【输入文件】 输入文件 energy.in 的第一行是一个正整数 N (4?N?100) , 表示项链上珠子的个数。 第二行是 N 个用空格隔开的正整数,所有的数均不超过 1000。第 i 个数为第 i 颗珠子的头 标记(1?i?N) ,当 i<N 时,第 i 颗珠子的尾标记应该等于第 i+1 颗珠子的头标记。第 N 颗珠子的尾标记应该等于第 1 颗珠子的头标记。 至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一 颗珠子,然后按顺时针方向确定其他珠子的顺序。 【输出文件】 输出文件 energy.out 只有一行,是一个正整数 E(E?2.1*109) ,为一个最优聚合顺 序所释放的总能量。 【输入样例】 4 2 3 5 10 【输出样例】 710

2.金明的预算方案
第 33 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

(budget.pas/c/cpp) 【问题描述】 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞 的房间。更让他高兴的是,妈妈昨天对他说: “你的房间需要购买哪些物品,怎么布置,你说 了算, 只要不超过 N 元钱就行” 。 今天一早, 金明就开始做预算了, 他把想买的物品分为两类: 主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 电脑 书柜 书桌 工作椅 附件 打印机,扫描仪 图书 台灯,文具 无

如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、1 个 或 2 个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的 N 元。于是,他把每件物品规定了一个重要度,分为 5 等:用整数 1~5 表示,第 5 等最重要。 他还从因特网上查到了每件物品的价格(都是 10 元的整数倍) 。他希望在不超过 N 元(可以 等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。 设第 j 件物品的价格为 v[j],重要度为 w[j],共选中了 k 件物品,编号依次为 j1, j2,??,jk,则所求的总和为: v[j1]*w[j1]+v[j2]*w[j2]+ ?+v[jk]*w[jk]。 (其中*为乘号) 请你帮助金明设计一个满足要求的购物单。 【输入文件】 输入文件 budget.in 的第 1 行,为两个正整数,用一个空格隔开: N m (其中 N(<32000)表示总钱数,m(<60)为希望购买物品的个数。 ) 从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整 数 v p q (其中 v 表示该物品的价格(v<10000) ,p 表示该物品的重要度(1~5) ,q 表示该物品 是主件还是附件。如果 q=0,表示该物品为主件,如果 q>0,表示该物品为附件,q 是所属 主件的编号) 【输出文件】 输出文件 budget.out 只有一个正整数,为不超过总钱数的物品的价格与重要度乘积的总 和的最大值(<200000) 。 【输入样例】 1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0
第 34 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输出样例】 2200

3.作业调度方案
(jsp.pas/c/cpp)

【问题描述】 我们现在要利用 m 台机器加工 n 个工件,每个工件都有 m 道工序,每道工序都在不同的 指定的机器上完成。每个工件的每道工序都有指定的加工时间。 每个工件的每个工序称为一个操作, 我们用记号 j-k 表示一个操作, 其中 j 为 1 到 n 中 的某个数字,为工件号;k 为 1 到 m 中的某个数字,为工序号,例如 2-4 表示第 2 个工件第 4 道工序的这个操作。在本题中,我们还给定对于各操作的一个安排顺序。 例如,当 n=3,m=2 时, “1-1,1-2,2-1,3-1,3-2,2-2”就是一个给定的安排顺 序,即先安排第 1 个工件的第 1 个工序,再安排第 1 个工件的第 2 个工序,然后再安排第 2 个工件的第 1 个工序,等等。 一方面,每个操作的安排都要满足以下的两个约束条件。 (1) 对同一个工件,每道工序必须在它前面的工序完成后才能开始; (2) 同一时刻每一台机器至多只能加工一个工件。 另一方面,在安排后面的操作时,不能改动前面已安排的操作的工作状态。 由于同一工件都是按工序的顺序安排的,因此,只按原顺序给出工件号,仍可得到同样 的安排顺序,于是,在输入数据中,我们将这个安排顺序简写为“1 1 2 3 3 2” 。 还要注意, “安排顺序”只要求按照给定的顺序安排每个操作。不一定是各机器上的实际 操作顺序。在具体实施时,有可能排在后面的某个操作比前面的某个操作先完成。 例如,取 n=3,m=2,已知数据如下: 机器号/加工时间 工件号 工序 1 工序 2 1 1/3 2/2 2 1/2 2/5 3 2/2 1/4 则对于安排顺序“1 1 2 3 3 2” ,下图中的两个实施方案都是正确的。但所需要的总时间 分别是 10 与 12。

当一个操作插入到某台机器的某个空档时(机器上最后的尚未安排操作的部分也可以看 作一个空档) ,可以靠前插入,也可以靠后或居中插入。为了使问题简单一些,我们约定:在 保证约束条件(1) (2)的条件下,尽量靠前插入。并且,我们还约定,如果有多个空档可 以插入,就在保证约束条件(1) (2)的条件下,插入到最前面的一个空档。于是,在这些 约定下,上例中的方案一是正确的,而方案二是不正确的。 显然,在这些约定下,对于给定的安排顺序,符合该安排顺序的实施方案是唯一的,请
第 35 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

你计算出该方案完成全部任务所需的总时间。 【输入文件】 输入文件 jsp.in 的第 1 行为两个正整数,用一个空格隔开: m n (其中 m(<20)表示机器数,n(<20)表示工件数) 第 2 行: m ? n 个用空格隔开的数,为给定的安排顺序。 接下来的 2n 行,每行都是用空格隔开的 m 个正整数,每个数不超过 20。 其中前 n 行依次表示每个工件的每个工序所使用的机器号,第 1 个数为第 1 个工序的机器 号,第 2 个数为第 2 个工序机器号,等等。 后 n 行依次表示每个工件的每个工序的加工时间。 可以保证,以上各数据都是正确的,不必检验。 【输出文件】 输出文件 jsp.out 只有一个正整数,为最少的加工时间。 【输入样例】 2 3 1 1 2 3 3 2 1 2 1 2 2 1 3 2 2 5 2 4 【输出样例】 10

4.2k 进制数
(digital.pas/c/cpp) 【问题描述】 设 r 是个 2k 进制数,并满足以下条件: (1)r 至少是个 2 位的 2k 进制数。 (2)作为 2k 进制数,除最后一位外,r 的每一位严格小于它右边相邻的那一位。 (3)将 r 转换为 2 进制数 q 后,则 q 的总位数不超过 w。 在这里,正整数 k(1?k?9)和 w(k<w?30000)是事先给定的。 问:满足上述条件的不同的 r 共有多少个? 我们再从另一角度作些解释:设 S 是长度为 w 的 01 字符串(即字符串 S 由 w 个“0”或 “1”组成) ,S 对应于上述条件(3)中的 q。将 S 从右起划分为若干个长度为 k 的段,每 段对应一位 2k 进制的数,如果 S 至少可分成 2 段,则 S 所对应的二进制数又可以转换为上 述的 2k 进制数 r。 例:设 k=3,w=7。则 r 是个八进制数(23=8) 。由于 w=7,长度为 7 的 01 字符串按 3 位一段分,可分为 3 段(即 1,3,3,左边第一段只有一个二进制位) ,则满足条件的八进制 数有: 2 位数:高位为 1:6 个(即 12,13,14,15,16,17) ,高位为 2:5 个,?,高位 为 6:1 个(即 67) 。共 6+5+?+1=21 个。 3 位数:高位只能是 1,第 2 位为 2:5 个(即 123,124,125,126,127) ,第 2 位 为 3:4 个,?,第 2 位为 6:1 个(即 167) 。共 5+4+?+1=15 个。 所以,满足要求的 r 共有 36 个。 【输入文件】 输入文件 digital.in 只有 1 行,为两个正整数,用一个空格隔开:
第 36 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

k W 【输出文件】 输出文件 digital.out 为 1 行,是一个正整数,为所求的计算结果,即满足条件的不同的 r 的个数(用十进制数表示) ,要求最高位不得为 0,各数字之间不得插入数字以外的其他字 符(例如空格、换行符、逗号等) 。 (提示:作为结果的正整数可能很大,但不会超过 200 位) 【输入样例】 3 7 【输出样例】 36

2007

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

提高组

题目一览
题目名称 代号 输入文件 输出文件 时限 统计数字 count count.in count.out 1秒 字符串的展开 expand expand.in expand.out 1秒 矩阵取数游戏 game game.in game.out 1秒 树网的核 core core.in core.out 1秒

(2007 年 11 月 17 日 3 小时完成)
说明: 1. 文件名(程序名和输入输出文件名)必须使用小写 2. C/C++中函数 main()的返回值必须是 int,程序正常结束时返回值必须是 0。 3. 全国统一评测时采用的机器参考配置为:CPU 2.0GHz,内存 256M。

1. 统计数字(count.pas/c/cpp)(测试数据.rar)
【问题描述】 某次科研调查时得到了 n 个自然数,每个数均不超过 1500000000(1.5*109) 。已知不相同 的数不超过 10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的 顺序输出统计结果。 【输入】 输入文件 count.in 包含 n+1 行; 第一行是整数 n,表示自然数的个数;
第 37 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 2~n+1 每行一个自然数。 【输出】 输出文件 count.out 包含 m 行(m 为 n 个自然数中不相同数的个数) ,按照自然数从小到大的 顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。 【输入输出样例】 count.in 8 2 4 2 4 5 100 2 100 count.out 2 3 4 2 5 1 100 2

【限制】 40%的数据满足:1<=n<=1000 80%的数据满足:1<=n<=50000 100%的数据满足:1<=n<=200000,每个数均不超过 1500 000 000(1.5*109)

2. 字符串的展开(expand.pas/c/cpp)(测试数据.rar)
【问题描述】 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果 在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出 时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh” 和“45678” 。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约 定如下: (1) 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“ -” ,减号两 侧同为小写字母或同为数字, 且按照 ASCII 码的顺序, 减号右边的字符严格大于左边的字符。 (2) 参数 p1:展开方式。p1=1 时,对于字母子串,填充小写字母;p1=2 时,对于字母子 串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3 时,不论是字母子串还是 数字字串,都用与要填充的字母个数相同的星号“*”来填充。 (3) 参数 p2:填充字符的重复个数。p2=k 表示同一个字符要连续填充 k 个。例如,当 p2= 3 时,子串“d-h”应扩展为“deeefffgggh” 。减号两边的字符不变。 (4) 参数 p3:是否改为逆序:p3=1 表示维持原来顺序,p3=2 表示采用逆序输出,注意这 时候仍然不包括减号两端的字符。例如当 p1=1、p2=2、p3=2 时,子串“d-h”应扩展为“dg gffeeh” 。 (5) 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如: “d-e”应输 出为“de” , “3-4”应输出为“34” 。如果减号右边的字符按照 ASCII 码的顺序小于或等于左 边字符,输出时,要保留中间的减号,例如: “d-d”应输出为“d-d” , “3-1”应输出为“3-1” 。 【输入】 输入文件 expand.in 包括两行: 第 1 行为用空格隔开的 3 个正整数,一次表示参数 p1,p2,p3。 第 2 行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。 【输出】 输出文件 expand.out 只有一行,为展开后的字符串。
第 38 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入输出样例 1】 expand.in 1 2 1 abcs-w1234-9s-4zz 【输入输出样例 2】 expand.in 2 3 2 a-d-d 【输入输出样例 3】 expand.in 3 4 2 di-jkstra2-6 expand.out dijkstra2************6 expand.out aCCCBBBd-d expand.out abcsttuuvvw1234556677889s-4zz

【限制】 40%的数据满足:字符串长度不超过 5 100%的数据满足:1<=p1<=3,1<=p2<=8,1<=p3<=2。字符串长度不超过 100

3. 矩阵取数游戏(game.pas/c/cpp)(测试数据.rar)
【问题描述】 帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的 n*m 的矩阵,矩阵中的每个元素 a ij 据为非负整数。游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共 n 个。m 次后取完矩阵所有的元素; 2. 每次取走的各个元素只能是该元素所在行的行首或行尾; 3. 每次取数都有一个得分值,为每行取数的得分之和;每行取数的得分 = 被取走的元素 值*2i,其中 i 表示第 i 次取数(从 1 开始编号) ; 4. 游戏结束总得分为 m 次取数得分之和。 帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。 【输入】 输入文件 game.in 包括 n+1 行; 第一行为两个用空格隔开的整数 n 和 m。 第 2~n+1 行为 n*m 矩阵,其中每行有 m 个用单个空格隔开 【输出】 输出文件 game.out 仅包含 1 行,为一个整数,即输入矩阵取数后的最大的分。 【输入输出样例 1】 game.in 2 3 1 2 4 3 4 2 game.out 82

【输入输出样例 1 解释】 第 1 次:第一行取行首元素,第二行取行尾元素,本次的氛围 1*21+2*21=6 第 2 次:两行均取行首元素,本次得分为 2*22+3*22=20
第 39 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 3 次:得分为 3*23+4*23=56。总得分为 6+20+56=82 【输入输出样例 2】 game.in 1 4 4 5 0 5 【输入输出样例 3】 game.in 2 10 96 56 54 46 86 12 23 88 80 43 16 95 18 29 30 53 88 83 64 67 game.out 316994 game.out 122

【限制】 60%的数据满足:1<=n, m<=30,答案不超过 1016 100%的数据满足:1<=n, m<=80,0<=aij<=1000

4. 树网的核(core.pas/c/cpp)(测试数据.rar)
【问题描述】 设 T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树) ,每条边到有正整数的权, 我们称 T 为树网(treebetwork) ,其中 V,E 分别表示结点与边的集合,W 表示各边长度的集 合,并设 T 有 n 个结点。
路径:树网中任何两结点 a,b 都存在唯一的一条简单路径,用 d(a, b)表示以 a, b 为端点的路径的长 度,它是该路径上各边长度之和。我们称 d(a, b)为 a, b 两结点间的距离。

D(v, P)=min{d(v, u), u 为路径 P 上的结点}。
树网的直径:树网中最长的路径成为树网的直径。对于给定的树网 T,直径不一定是唯一的,但可以证 明:各直径的中点(不一定恰好是某个结点,可能在某条边的内部)是唯一的,我们称该点为树网的中心。 偏心距 ECC(F):树网 T 中距路径 F 最远的结点到路径 F 的距离,即

ECC(F)=max{d(v, F),v∈V}
任务:对于给定的树网 T=(V, E, W)和非负整数 s,求一个路径 F,他是某直径上的一段路径(该路径 两端均为树网中的结点),其长度不超过 s(可以等于 s),使偏心距 ECC(F)最小。我们称这个路径为树网 T=(V, E, W)的核(Core)。必要时,F 可以退化为某个结点。一般来说,在上述定义下,核不一定只有一个, 但最小偏心距是唯一的。 下面的图给出了树网的一个实例。图中,A-B 与 A-C 是两条直径,长度均为 20。点 W 是树网的中心,E F 边的长度为 5。如果指定 s=11,则树网的核为路径 DEFG(也可以取为路径 DEF),偏心距为 8。如果指定 s =0(或 s=1、s=2),则树网的核为结点 F,偏心距为 12。

第 40 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入】 输入文件 core.in 包含 n 行: 第 1 行,两个正整数 n 和 s,中间用一个空格隔开。其中 n 为树网结点的个数,s 为树网的 核的长度的上界。设结点编号以此为 1,2,??,n。 从第 2 行到第 n 行,每行给出 3 个用空格隔开的正整数,依次表示每一条边的两个端点编 号和长度。例如, “2 4 7”表示连接结点 2 与 4 的边的长度为 7。 所给的数据都是争取的,不必检验。 【输出】 输出文件 core.out 只有一个非负整数,为指定意义下的最小偏心距。 【输入输出样例】 【输入输出样例 1】 core.in 5 2 1 2 5 2 3 2 2 4 4 2 5 3 【输入输出样例 2】 core.in 8 6 1 3 2 2 3 2 3 4 6 4 5 3 4 6 4 4 7 2 7 8 3 core.out 5 Core.out 5

【限制】 40%的数据满足:5<=n<=15 70%的数据满足:5<=n<=80 100%的数据满足:5<=n<=300,0<=s<=1000。边长度为不超过 1000 的正整数 2008

第 41 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第十四届全国信息学奥林匹克分区联赛(NOIP2008)复赛试 题
(提高组 竞赛用时:3 小时)
一、题目概览
中文题目名称 英文题目名称 可执行文件名 输入文件名 输出文件名 每个测试点时限 测试点数目 每个测试点分值 比较方式 题目类型 笨小猴 word word word,in word.out 1秒 10 10 全文比较 传统 火柴棒等式 matches matches matches.in matches.out 1秒 10 10 全文比较 传统 传纸条 message message message.in message.out 1秒 10 10 全文比较 传统 双栈排序 twostack twostack twostack.in twostack.out 1秒 10 10 全文比较 传统

二、提交源程序文件名
对于 Pascal 语言 对于 C 语言 对于 C++语言 word.pas word.c word.cpp matches.pas matches.c matches.cpp message.pas message.c message.cpp twostack.pas twostack.c twostack.cpp

三、编译命令(不包含任何优化开关)
对于 Pascal 语言 对于 C 语言 对于 C++语言 fpc word.pas gcc –o word word.c g++ -o word word.cpp fpc matches.pas gcc –o matches matches.c g++-o matches matches.cpp fpc message.pas gcc –o message message.c g++ -o message message.cpp fpc twostack.pas gcc –o twostack twostack.c g++ -o twostack twostack.cpp

四、运行内存限制
运行内存上限 50M 50M 50M 50M

注意事项:
1. 文件名(程序名和输入输出文件名)必须使用大写。 2. C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3. 全国统一评测时采用的机器配置为:CPU 1.9GHz,内存 512M,上述时限以此配置为准。 各省在自测时可根据具体配置调整时限。 1. 笨小猴(word.pas/c/cpp) 【问题描述】 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法, 经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设 maxn 是单词中出现次数最多的字母的出现次数,minn 是单词中出现次数最少的字母的出现次数,如果 maxn-minn 是一个质数,那么笨小猴就认为 这是个 Lucky Word,这样的单词很可能就是正确的答案。

第 42 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入】 输入文件 word.in 只有一行, 是一个单词, 其中只可能出现小写字母, 并且长度小于 100。 【输出】 输出文件 word.out 共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那 么输出“Lucky Word” ,否则输出“No Answer” ; 第二行是一个整数,如果输入单词是 Lucky Word,输出 maxn-minn 的值,否则输出 0。 【输入输出样例 1】 word.in error word.out Lucky Word 2

【输入输出样例 1 解释】 单词 error 中出现最多的字母 r 出现了 3 次,出现次数最少的字母出现了 1 次,3-1=2,2 是质数。 【输入输出样例 2】 word.in olympic word.out No Answer 0

【输入输出样例 2 解释】 单词 olympic 中出现最多的字母 i 出现了 2 次,出现次数最少的字母出现了 1 次,2-1=1, 1 不是质数。

第 43 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

2. 火柴棒等式(matches.pas/c/cpp)
【问题描述】 给你 n 根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的 A、B、C 是用 火柴棍拼出的整数(若该数非零,则最高位不能是 0) 。用火柴棍拼数字 0-9 的拼法如图所示:

注意: 1)加号与等号各自需要两根火柴棍 2)如果 A≠B,则 A+B=C 与 B+A=C 视为不同的等式(A、B、C>=0) 3)n 根火柴棍必须全部用上 【输入】 输入文件 matches.in 共一行,又一个整数 n(n<=24) 。 【输出】 输出文件 matches.out 共一行,表示能拼成的不同等式的数目。 【输入输出样例 1】 matches.in 14 【输入输出样例 1 解释】 2 个等式为 0+1=1 和 1+0=1。 【输入输出样例 2】 matches.in 18 9 matches.out 2 matches.out

【输入输出样例 2 解释】9 个等式为: 0+4=4 0+11=11 1+10=11 2+2=4 2+7=9 4+0=4 7+2=9 10+1=11 11+0=11

第 44 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

3. 传纸条(message.pas/c/cpp)
【问题描述】 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动 中,班上同学安排做成一个 m 行 n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因 此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多 同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。 从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向 左传递。 在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学 都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙, 那么在小轩递给小渊的时候就不会再帮忙。反之亦然。 还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩 的好心程度没有定义,输入时用 0 表示) ,可以用一个 0-100 的自然数来表示,数越大表示越 好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径, 使得这两条路径上同学的好心程度只和最大。现在,请你帮助小渊和小轩找到这样的两条路 径。 【输入】 输入文件 message.in 的第一行有 2 个用空格隔开的整数 m 和 n,表示班里有 m 行 n 列 (1<=m,n<=50) 。 接下来的 m 行是一个 m*n 的矩阵, 矩阵中第 i 行 j 列的整数表示坐在第 i 行 j 列的学生的 好心程度。每行的 n 个整数之间用空格隔开。 【输出】 输出文件 message.out 共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的 好心程度之和的最大值。 【输入输出样例】 message.in 33 039 285 570 【限制】 30%的数据满足:1<=m,n<=10 100%的数据满足:1<=m,n<=50 34 message.out

第 45 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

4. 双栈排序(twostack.pas/c/cpp)
【问题描述】 Tom 最近在研究一个有趣的排序问题。如图所示,通过 2 个栈 S1 和 S2,Tom 希望借助 以下 4 种操作实现将输入序列升序排序。 操作 a:如果输入序列不为空,将第一个元素压入栈 S1 操作 b:如果栈 S1 不为空,将 S1 栈顶元素弹出至输出序列 操作 c:如果输入序列不为空,将第一个元素压入栈 S2 操作 d:如果栈 S2 不为空,将 S2 栈顶元素弹出至输出序列 如果一个 1~n 的排列 P 可以通过一系列操作使得输出序列为 1,2,?,(n-1),n,Tom 就称 P 是一个“可双栈排序排列” 。例如(1,3,2,4)就是一个“可双栈 排序序列” ,而(2,3,4,1)不是。下图描述了一个将(1,3,2,4)排序的操作序列:<a,c,c,b,a,d,d,b>

当然,这样的操作序列有可能有几个,对于上例(1,3,2,4),<a,c,c,b,a,d,d,b>是另外一个可 行的操作序列。Tom 希望知道其中字典序最小的操作序列是什么。 【输入】 输入文件 twostack.in 的第一行是一个整数 n。第二行有 n 个用空格隔开的正整数,构成 一个 1~n 的排列。 【输出】 输出文件 twostack.out 共一行,如果输入的排列不是“可双栈排序排列” ,输出数字 0; 否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。 【输入输出样例 1】 twostack.in 4 1324 twostack.out abaabbab
第 46 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入输出样例 2】 twostack.in 4 2341 【输入输出样例 3】 twostack.in 3 231 【限制】 30%的数据满足: n<=10 50%的数据满足: n<=50 100%的数据满足: n<=1000 twostack.out acabbd 0 twostack.out

第 47 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第十五届全国信息学奥林匹克分区联赛(NOIP2009)复赛试 题
(提高组 竞赛用时:3 小时)
一. 题目概况

二. 提交程序文件名

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

四. 运行内存限制

第 48 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

注意事项:

1、文件名(程序名和输入输出文件名)必须使用小写。 2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3、全国统一评测时采用的机器配置为:CPU 1.9GHz,内存 1G, 上述时限以此配置为准。 各

省在自测时可根据具体配置调整时限。

1、潜伏者(spy.pas/c/cpp)
【问题描述】 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动。历经艰险后, 潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1)S 国军方内部欲发送的原信息经过加密后在网络上发送,原信息的内容与加密后所的 内容均由大写字母‘A’—‘Z’构成(无空格等其他字母) 。 2)S 国对于每个字母规定了对应的“密字” 。加密的过程就是将原信息中的所有字母替 换为其对应的“密字” 。 3)每个字母只对应一个唯一的“密字” ,不同的字母对应不同的“密字” 。 “密字”可以 和原字母相同。 例如,若规定‘A’的密字为‘A’ , ‘B’的密字为‘C’ (其他字母及密字略) ,则原信 息“ABA”被加密为“ACA” 。 现在,小 C 通过内线掌握了 S 国网络上发送的一条加密信息及其对应的原信息。小 C 希 望能通过这条信息,破译 S 国的军用密码。小 C 的破译过程是这样的:扫描原信息,对于原 信息中的字母 x(代表任一大写字母) ,找督其在加密信息中的对应大写字母 y,并认为在密 码里 y 是 x 的密字。如此进行下去直到停止于如下的某个状态: 1)所有信息扫描完毕, ‘A’—‘Z’所有 26 个字母在原信息中均出现过并获得了相应 的“密字” 。 2)所有信息扫描完毕,但发现存在某个(或某些)字母在原信息中没有出现。 3)扫描中发现掌握的信息里有明显的自相矛盾或错误(违反 S 过密码的编码规则) 。例 如某条信息“XYZ”被翻译为“ABA”就违反了“不同字母对应不同密字”的规则。 在小 C 忙得头昏脑胀之际,R 国司令部又发来电报,要求他翻译另外一条从 S 国刚刚截 取到的加密信息。现在请你帮助小 C:通过内线掌握的信息,尝试破译密码。然后利用破译 的密码,翻译电报中的加密信息。 【输入】 输入文件名为 spy.in,共 3 行,每行为一个长度在 1 到 100 之间的字符串。第 1 行为小 C 掌握的一条加密信息。第 2 行为第 1 行的加密信息所对应的原信息。第 3 行为 R 国司令部要 求小 C 翻译的加密信息。 输入数据保证所有字符串仅由大写字母‘A’—‘Z’构成,且第 1 行长度与第 2 行相等。 【输出】 输出文件 spy.out 共 1 行。若破译密码停止时出现 2,3 两种情况,请你输出“Failed” (不 含引号,注意首字母大写,其它小写) 。否则请输出利用密码翻译电报中加密信息后得到的原 信息。 【输入输出样例 1】 Spy.in Spy.out
第 49 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

AA AB EOWIE

Failed

【输入输出样例说明】 原信息中的字母“A”禾? B”对应相同的密字,输出“Failed” 。 【输入输出样例 2】 Spy.in QWERTYUIOPLKJHGFDSAZXCVBN ABCDEFGHIJKLMNOPQRSTUVWXY DSLIEWO Spy.out Failed

【输入输出样例 2 说明】 字母“Z”在原信息中没有出现,输出“Failed” 。 【输入输出样例 3】 Spy.in MSRTZCJKPFLQYVAWBINXUEDGHOOILSMIJFRCOPPQCEUNYDUMP P YIZSDWAHLNOVFUCERKJXQMGTBPPKOIYKANZWPLLVWMQJFGQY LL FLSO Spy.ou t NOIP

2、Hankson 的趣味题(son.pas/c/cpp)
【问题描述】 Hanks 博士是 BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫 Hankson。现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题。 今天在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数和最小公倍数。现 在 Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”禾?求公倍 数”之类问题的“逆问题” ,这个问题是这样的:已知正整数 a0,a1,b0,b1,设某未知正整 数 x 满足:
第 50 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

1)x 和 a0 的最大公约数是 a1; 2)x 和 b0 的最小公倍数是 b1。Hankson 的“逆问题”就是求出满足条件的正整数 x。但 稍加思索之后,他发现这样的 x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解 满足条件的 x 的个数。请你帮助他编程求解这个问题。 【输入】 输入文件名为 son.in。第一行为一个正整数 n,表示有 n 组输入数据。接下来的 n 行每行 一组输入数据,为四个正整数 a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据 保证 a0 能被 a1 整除,b1 能被 b0 整除。 【输出】 输出文件 son.out 共 n 行。 每组输入数据的输出结果占一行, 为一个整数。 对于每组数据: 若不存在这样的 x,请输出 0; 若存在这样的 x,请输出满足条件的 x 的个数; 【输入输出样例】 Son.in 2 41 1 96 288 95 1 37 1776 Son.out 6 2

【说明】 第一组输入数据,X 可以是 9、18、36、72、144、288,共有 6 个。 第二组输入数据,X 可以是 48、1776,共有 2 个。 【数据范围】 对于 50%的数据,保证有 1?a0,b1,b0,b1?且 n?100。 对于 100%的数据,保证有 1?a0,b1,b0,b1?2000000000 且 n?2000。

第 51 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

3、最优贸易(trade.pas/c/cpp)
【问题描述】 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市。任意两个城 市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路,一部分为双 向通行的道路,双向通行的道路在统计条数时也计为 1 条。 C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价 格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。 商人阿龙来到 C 国旅游。当他得知同一种商品在不同城市的价格可能会不同这一信息之 后,便决定在旅游的同时,利用商品在不同城市中的差价赚回一点旅费。设 C 国 n 个城市的 标号从 1-n, 阿龙决定从 1 号城市出发, 并最终在 n 号城市结束自己的旅行。 在旅游的过程中, 任何城市可以重复经过多次,但不要求经过所有 n 个城市。阿龙通过这样的贸易方式赚取旅 费:他会选择一个经过的城市迈入他最喜欢的商品——水晶球,并在之后经过的另一个城市 卖出这个水晶球。用赚取的差价当作旅费。由于阿龙主要是来 C 国旅游,他决定这个贸易只 进行最多一次。当然,在赚不到差价的情况下它就无需进行贸易。 假设 C 国有 5 个大城市,城市的编号和道路连接情况如下图,单向箭头表示这条道路为 单向通行。双向箭头表示这条道路为双向通行。

假设 1~n 号城市的水晶球价格分别为 4,3,5,6,1。 阿龙可以选择如下一条线路:1->2->3->5,并在 2 号城市以 3 的价格买入水晶球,在 3 号城市以 5 的价格卖出水晶球,赚取的旅费数为 2。 阿龙也可以选择如下一条线路:1->4->5->4->5,并在第 1 次到达 5 号城市时以 1 的价格 买入水晶球,在第 2 次到达 4 号城市时以 6 的价格卖出水晶球,赚取的旅费数为 5。 现在给出 n 个城市的水晶球价格,m 条道路的信息(每条道路所连接的两个城市的编号 以及该条道路的通行情况) 。请你告诉阿龙,他最多能赚钱多少旅费。 【输入】 输入文件名为 trade.in。第一行包含 2 个正整数 n 和 m,中间用一个空格隔开,分别表示 城市的数目和道路的数目。第二行 n 个正整数,每两个正整数之间用一个空格隔开,按标号 顺序分别表示这 n 个城市的商品价格。接下来 m 行,每行有 3 个正整数,x,y,z,每两个 整数之间用一个空格隔开。如果 z=1,表示这条道路是城市 x 到城市 y 之间的单向道路;如 果 z=2,表示这条道路为城市 x 和城市 y 之间的双向道路。 【输出】 输出文件 trade.out 共 1 行,包含 1 个整数,表示最多能赚取的旅费。如果没有进行贸易, 则输出 0。 【输入输出样例】 Trade.in Trade.out

第 52 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

55 43561 121 141 232 351 452

5

【数据范围】 输入数据保证 1 号城市可以到达 n 号城市。 对于 10%的数据,1?n?6。 对于 30%的数据,1?n?100。 对于 50%的数据,不存在一条旅游路线,可以从一个城市出发,再回到这个城市。 对于 100%的数据,1?n?,1?m?,1?x,y?n,1?z?2,1?各城市水晶球价格? 100。

4、靶形数独(sudoku.pas/c/cpp)
【问题描述】 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高堤?但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的“靶形数独” ,作为这两个孩子比试的题目。 靶形数独的方格同普通数独一样, 在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格高 的小九宫格 (用粗黑色线隔开的) 。 在这个大九宫格中, 有一些数字是已知的, 根据这些数字, 利用逻辑推理,在其他的空格上填入 1 到 9 的数字。每个数字在每个小九宫格内不能重复出 现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即每一个 方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。 (如下图)

第 53 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

上图具体的分值分布是:最里面一格(黄色区域)为 10 分,黄色区域外面的一圈(红色 区域)每个格子为 9 分,再外面一圈(蓝色区域)每个格子为 8 分,蓝色区域外面一圈(棕 色区域)每个格子为 7 分,最外面一圈(白色区域)每个格子为 6 分,如上图所示。比赛的 要求是:每个人必须完成一个给定的数独(每个给定数独有可能有不同的填法) ,而且要争取 更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的 乘积的总禾?如图,在以下这个已经填完数字的靶形数独游戏中,总分为 2829。游戏规定, 将以总分数的高低决出胜负。

由于求胜心切,小城找督了善于编程的你,让你帮他求出,对于给定的靶形数独,能够 得到的最高分数。 【输入】 输入文件名为 sudoku.in。一共 9 行,每行 9 个整数(每个数都在 0—9 的范围内) ,表示 一个尚未填满的数独方格,未填满的空格用“0”表示。每两个数字之间用一个空格隔开。 【输出】 输出文件 sudoku.out 共 1 行。输出可以得到的靶形数独的最高分数。如果这个数独无解, 则输出整数-1。 【输入输出样例 1】 sudoku.in 7 0 0 9 0 0 0 0 1 1 0 0 0 0 5 9 0 0 0 0 0 2 0 0 0 8 0 Sudoku.out 2829

第 54 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

0 0 4 0 2 0

0 0 1 0 0 8

5 0 3 7 1 0

0 0 0 0 0 5

2 0 0 0 6 0

0 0 0 2 0 4

0 6 0 0 8 0

0 4 0 9 0 1

3 8 0 0 4 2

【输入输出样例 2】 0 9 7 1 0 0 0 0 0 0 0 4 9 7 3 0 6 0 0 0 0 5 0 0 0 0 0 7 0 0 0 0 5 6 9 0 0 0 0 8 0 7 0 0 0 sudoku.in 2 4 5 8 0 0 5 0 1 0 0 0 0 0 2 9 1 0 1 0 0 0 0 0 0 0 0 3 0 0 0 5 8 0 1 6 Sudoku.out 2852

【数据范围】 40%的数据,数独中非 0 数的个数不少于 30。 80%的数据,数独中非 0 数的个数不少于 26。 100%的数据,数独中非 0 数的个数不少于 24。

第十六届全国信息学奥林匹克分区联赛(NOIP2010)复赛试 题
(提高组 竞赛用时:3 小时)

1、机器翻译(translate.pas/c/cpp)
【问题描述】 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译 软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于 每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它 进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻 译,并将这个单词和译义放入内存,以备后续的查找和翻译。 假设内存中有 M 个单元,每 单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的 单词数不超过 M?1,软件会将新单词存入一个未使用的内存单元;若内存中已存入 M 个单 词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。 假设一篇英语文章的长度为 N 个单词。给定这篇待译文章,翻译软件需要去外存查找多 少次词典?假设在翻译开始前,内存中没有任何单词。 【输入】 输入文件名为 translate.in,输入文件共 2 行。每行中两个数之间用一个空格隔开。 第一行为两个正整数 M 和 N,代表内存容量和文章的长度。 第二行为 N 个非负整数,按照文章的顺序,每个数(大小不超过 1000)代表一个英文 单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。 【输出】
第 55 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

输出文件 translate.out 共 1 行,包含一个整数,为软件需要查词典的次数。 【输入输出样例 1】 37 1215441 输出 5 【输入输出样例 1 说明】 整个查字典过程如下:每行表示一个单词的翻译,冒号前为本次翻译后的内存状况: 空:内存初始状态为空。 1. 1:查找单词 1 并调入内存。 2. 1 2:查找单词 2 并调入内存。 3. 1 2:在内存中找到单词 1。 4. 1 2 5:查找单词 5 并调入内存。 5. 2 5 4:查找单词 4 并调入内存替代单词 1。 6. 2 5 4:在内存中找到单词 4。 7. 5 4 1:查找单词 1 并调入内存替代单词 2。 共计查了 5 次词典。 【输入输出样例 2】 translate.in translate.out 2 10 8 824 11 78 11 78 11 78 8 264 6 【数据范围】 对于 10%的数据有 M=1,N? 5。 对于 100%的数据有 0<M? 100,0<N? 1000。

第 56 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

2、乌龟棋 (tortoise.pas/c/cpp)
【问题描述】 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行 N 个格子,每个格子上一个分数(非负整数) 。棋盘第 1 格是唯 一的起点,第 N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终 点。 …… 1 2 3 4 5 …… N 乌龟棋中 M 张爬行卡片,分成 4 种不同的类型(M 张卡片中不一定包含所有 4 种类型的卡片,见样例) ,每种类型的卡片上分别标有 1、2、 3、4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩 家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片, 控制乌龟棋子前进相 应的格子数, 每张卡片只能使用一次。 游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就 得到该格子相应的分数。 玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格 子的分数总和。 很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡 片使用顺序使得最终游戏得分最多。 现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到 多少分吗? 【输入】 输入文件名 tortoise.in。输入文件的每行中两个数之间用一个空格隔开。 第 1 行 2 个正整数 N 和 M,分别表示棋盘格子数和爬行卡片数。 第 2 行 N 个非负整数,a1, a2, ??, aN,其中 ai 表示棋盘第 i 个格子上的分数。 第 3 行 M 个整数,b1,b2, ??, bM,表示 M 张爬行卡片上的数字。 输入数据保证到达终点时刚好用光 M 张爬行卡片,即 N?1= ∑Mib1。 【输出】 输出文件名 tortoise.out。 输出只有 1 行,1 个整数,表示小明最多能得到的分数。 【输入输出样例 1】 tortoise.in tortoise.out 95 6 10 14 2 8 8 18 5 17 13121 73 【输入输出样例 1 说明】 小明使用爬行卡片顺序为 1,1,3,1,2,得到的分数为 6+10+14+8+18+17=73。注意, 由于起点是 1,所以自动获得第 1 格的分数 6。 【输入输出样例 2】 tortoise.in tortoise.out 13 8 4 96 10 64 55 13 94 53 5 24 89 8 30 11111241 455 【数据范围】 对于 30%的数据有 1 ? N? 30,1 ?M? 12。
第 57 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

对于 50%的数据有 1 ? N? 120,1 ?M? 50,且 4 种爬行卡片,每种卡片的张数 不会超过 20。 对于 100%的数据有 1 ? N? 350,1 ?M? 120,且 4 种爬行卡片,每种卡片的张 数不会超过 40;0 ? ai ? 100,1 ? i ? N;1 ? bi ? 4,1 ? i ?M。输入数据保证 N?1=∑Mib1。

3、关押罪犯 (prison.pas/c/cpp)
【问题描述】 S 城现有两座监狱,一共关押着 N 名罪犯,编号分别为 1~N。他们之间的关系自然也极 不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨 气值” (一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之 间的积怨越多。如果两名怨气值为 c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并 造成影响力为 c 的冲突事件。 每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表, 然后上报到 S 城 Z 市长那里。公务繁忙的 Z 市长只会去看列表中的第一个事件的影响力, 如果影响很坏,他就会考虑撤换警察局长。 在详细考察了 N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在 两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只 要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那 么,应如何分配罪犯,才能使 Z 市长看到的那个冲突事件的影响力最小?这个最小值是多 少? 【输入】
第 58 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

输入文件名为 prison.in。输入文件的每行中两个数之间用一个空格隔开。 第一行为两个正整数 N 和 M,分别表示罪犯的数目以及存在仇恨的罪犯对数。 接下来的 M 行每行为三个正整数 aj,bj,cj,表示 aj 号和 bj 号罪犯之间存在仇恨,其 怨气值为 cj。数据保证 N b a j j? < ? 1 , 000 , 000 , 000 , 1 0 ? < jc ,且每对罪犯组合 只出现一次。 【输出】 输出文件 prison.out 共 1 行,为 Z 市长看到的那个冲突事件的影响力。如果本年内监 狱中未发生任何冲突事件,请输出 0。 【输入输出样例】 prison.in prison.out 46 1 4 2534 2 3 3512 1 2 28351 1 3 6618 2 4 1805 3 4 12884 3512 【输入输出样例说明】 罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件 影响力是 3512(由 2 号和 3 号罪犯引发) 。其他任何分法都不会比这个分法更优。 【数据范围】 对于 30%的数据有 N? 15。 对于 70%的数据有 N? 2000,M? 50000。 对于 100%的数据有 N? 20000,M? 100000。

4、沙漠
在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政 区划十分特殊,刚好构成一个 N 行 M 列的矩形,如上图所示,其中每个格子都代表一座城 市,每座城市都有一个海拔高度。 为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施 有两种,别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄 水池中。因此,只有与湖泊毗邻的第 1 行的城市可以建造蓄水厂。而输水站的功能则是通过 输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存 在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。 由于第 N 行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利 设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干 旱区中不可能建有水利设施的城市数目。 【输入】 输入文件名为 flow.in。输入文件的每行中两个数之间用一个空格隔开。 输入的第一行是两个正整数 N 和 M,表示矩形的规模。 接下来 N 行,每行 M 个正整数,依次代表每座城市的海拔高度。 【输出】 输出文件名为 flow.out。 输出有两行。如果能满足要求,输出的第一行是整数 1,第二行是一个整数,代表最少 建造几个蓄水厂;如果不能满足要求,输出的第一行是整数 0,第二行是一个整数,代表有 几座干旱区中的城市不可能建有水利设施。 【输入输出样例 1】
第 59 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

flow.in flow.out 25 91543 87612 1 1 【样例 1 说明】 只需要在海拔为 9 的那座城市中建造蓄水厂,即可满足要求。 【输入输出样例 2】 flow.in flow.out 36 845644 734333 322112 1 3 【样例 2 说明】 湖泊 8 4 5 6 4 4 7 3 4 3 3 3 3 2 2 1 1 2 沙漠 上图中,在 3 个粗线框出的城市中建造蓄水厂,可以满足要求。以这 3 个蓄水厂为源 头在干旱区中建造的输水站分别用 3 种颜色标出。当然,建造方法可能不唯一。 【数据范围】 本题共有 10 个测试数据,每个数据的范围如下表所示: 测试数据编号 能否满足要求 N M 1 不能 ? 10 ? 10 2 不能 ? 100 ? 100 3 不能 ? 500 ? 500 4 能 = 1 ? 10 5 能 ? 10 ? 10 6 能 ? 100 ? 20 7 能 ? 100 ? 50 8 能 ? 100 ? 100 9 能 ? 200 ? 200 10 能 ? 500 ? 500 对于所有的 10 个数据,每座城市的海拔高度都不超过 106。

第 60 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

全国信息学奥林匹克联赛(NOIP2011)复赛 提高组 Day1
一. 题目概况

二.

提交源程序文件名

三.

编译命令(不包含任何编译开关

四.

运行内存限制

注意事项: 1、 文件名(程序名和输入输出文件名)必须用英文小写。 2、 C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3、 全国统一评测时采用的机器配置为:CPU P4 3.0GHz,内存 1G,上述时限以此配置为 准。 4、 特别提醒:评测在 NOI Linux 下进行。

1、铺地毯
【问题描述】
第 61 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标 系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到 n。 现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前 面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地 毯的编号。 注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。 【输入】 输入文件名为 carpet.in。 输入共 n+2 行。 第一行,一个整数 n,表示总共有 n 张地毯。 接下来的 n 行中,第 i+1 行表示编号 i 的地毯的信息,包含四个正整数 a,b,g,k, 每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在 x 轴和 y 轴方向的长度。 第 n+2 行包含两个正整数 x 和 y,表示所求的地面的点的坐标(x,y) 。 【输出】 输出文件名为 carpet.out。 输出共 1 行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。 【输入输出样例 1】 carpet.in 3 1023 0233 2133 22

carpet.out

3

【输入输出样例说明】 如下图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,覆盖点(2, 2)的最上面一张地毯是 3 号地毯。

【输入输出样例 2】 carpet.in

carpet.out
第 62 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

3 1023 0233 2133 45

-1

【输入输出样例说明】 如上图,1 号地毯用实线表示,2 号地毯用虚线表示,3 号用双实线表示,点(4,5) 没有被地毯覆盖,所以输出-1。 【数据范围】 对于 30%的数据,有 n?2; 对于 50%的数据,0?a, b, g, k?100; 对于 100%的数据,有 0?n?10,000,0?a, b, g, k?100,000。

2、选择客栈
【问题描述】 丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号。每家客栈都按 照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示) ,且每家客栈都设有一家咖啡店, 每家咖啡店均有各自的最低消费。 两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定 分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于 两人住的两家客栈之间(包括他们住的客栈) ,且咖啡店的最低消费不超过 p。 他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p 元 的咖啡店小聚。 【输入】 输入文件 hotel.in,共 n+1 行。 第一行三个整数 n,k,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色 调的数目和能接受的最低消费的最高值;接下来的 n 行,第 i+1 行两个整数,之间用一个空 格隔开,分别表示 i 号客栈的装饰色调和 i 号客栈的咖啡店的最低消费。 【输出】 输出文件名为 hotel.out。 输出只有一行,一个整数,表示可选的住宿方案的总数。 【输入输出样例 1】 hotel.in 523 05 13 02 14 15

hotel.out

3

第 63 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入输出样例说明】 客栈编号 色调 最低消费 ① 0 5 ② 1 3 ③ 0 2 ④ 1 4 ⑤ 1 5

2 人要住同样色调的客栈,所有可选的住宿方案包括:住客栈①③,②④,②⑤,④⑤, 但是若选择住 4、5 号客栈的话,4、5 号客栈之间的咖啡店的最低消费是 4,而两人能承受 的最低消费是 3 元,所以不满足要求。因此只有前 3 种方案可选。 【数据范围】 对于 30%的数据,有 n?100; 对于 50%的数据,有 n?1,000; 对于 100%的数据,有 2?n?200,000,0<k?50,0?p?100, 0?最低消费?100。

3、mayan 游戏
【问题描述】 Mayan puzzle 是最近流行起来的一个游戏。游戏界面是一个 7 行 5 列的棋盘,上面堆放 着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上。游 戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1、 每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时, 如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将交换位置(参 见输入输出样例说明中的图 6 到图 7) ;如果目标位置上没有方块,那么被拖动的方块将 从原来的竖列中抽出,并从目标位置上掉落(直到不悬空,参见下面图 1 和图 2) ;

2、 任一时刻,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们 将立即被消除(参见图 1 到图 3) 。 注意: a) 如果同时有多组方块满足消除条件,几组方块会同时被消除(例如下面图 4,三个颜 色为 1 的方块和三个颜色为 2 的方块会同时被消除,最后剩下一个颜色为 2 的方块) 。 b) 当出现行和列都满足消除条件且行列共享某个方块时,行和列上满足消除条件的所有 方块会被同时消除(例如下面图 5 所示的情形,5 个方块会同时被消除) 。

第 64 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

方块消除之后,消除位置之上的方块将掉落,掉落后可能会引起新的方块消除。注意: 掉落的过程中将不会有方块的消除。上面图 1 到图 3 给出了在棋盘上移动一块方块之后棋 盘的变化。棋盘的左下角方块的坐标为(0, 0) ,将位于(3, 3)的方块向左移动之后,游戏界 面从图 1 变成图 2 所示的状态,此时在一竖列上有连续三块颜色为 4 的方块,满足消除条 件,消除连续 3 块颜色为 4 的方块后,上方的颜色为 3 的方块掉落,形成图 3 所示的局面。 【输入】 输入文件 mayan.in,共 6 行。 第一行为一个正整数 n,表示要求游戏通关的步数。 接下来的 5 行,描述 7*5 的游戏界面。每行若干个整数,每两个整数之间用一个空格 隔开,每行以一个 0 结束,自下向上表示每竖列方块的颜色编号(颜色不多于 10 种, 从 1 开始顺序编号,相同数字表示相同颜色) 。输入数据保证初始棋盘中没有可以消除 的方块。 【输出】 输出文件名为 mayan.out。 如果有解决方案,输出 n 行,每行包含 3 个整数 x,y,g,表示一次移动,每两个整数 之间用一个空格隔开,其中(x,y)表示要移动的方块的坐标,g 表示移动的方向,1 表示 向右移动,-1 表示向左移动。注意:多组解时,按照 x 为第一关健字,y 为第二关健字,1 优先于-1,给出一组字典序最小的解。游戏界面左下角的坐标为(0,0) 。如果没有解决方案, 输出一行,包含一个整数-1。 【输入输出样例 1】 mayan.in mayan.out 3 10 211 210 311 2340 301 310 24340 【输入输出样例说明】 按箭头方向的顺序分别为图 6 到图 11

第 65 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

样例输入的游戏局面如上面第一个图片所示,依次移动的三步是: (2,1)处的方格向右 移动, (3,1)处的方格向右移动, (3,0)处的方格向右移动,最后可以将棋盘上所有 方块消除。 【数据范围】 对于 30%的数据,初始棋盘上的方块都在棋盘的最下面一行; 对于 100%的数据,0 < n?5。

提高组 Day2
一. 题目概括

二.

提交源程序文件名

三.

编译命令(不包含任何优化开关)
第 66 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

四.

运行内存限制

注意事项: 1、 文件名(程序名和输入输出文件名)必须使用英文小写。 2、 C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3、 全国统一评测时采用的机器配置为:CPU P4 3.0GHz,内存 1G,上述时限以此配置为 准。 4、 特别提醒:评测在 NOI Linux 下进行。

1、计算系数
【问题描述】 给定一个多项式(ax + by)^k,请求出多项式展开后(x^n)*(y^m)项的系数。 【输入】 输入文件名为 factor.in。 共一行,包含 5 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开。 【输出】 输出文件名为 factor.out。 输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对 10007 取 模后的结果。 【输入输出样例】 factor.in factor.out 11312 3 【数据范围】 对于 30%的数据,有 0?k?10; 对于 50%的数据,有 a = 1,b = 1; 对于 100%的数据,有 0?k?1,000,0?n, m?k,且 n + m = k,0?a,b?1,000,000。

第 67 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

2、聪明的质监员
【问题描述】 小 T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1 到 n 逐一编号,每个矿石都有自己的重量 wi 以及价值 vi。检验矿产的流程是: 1、给定 m 个区间[Li,Ri]; 2、选出一个参数 W; 3、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值 Yi :Yi=sum*sumv。sum 为 [Li,Ri]之间 Wi>=W 的矿石数量,sumv 为其价值和。 这批矿产的检验结果 Y 为各个区间的检验值之和。 若这批矿产的检验结果与所给标准值 S 相差太多,就需要再去检验另一批矿产。小 T 不 想费时间去检验另一批矿产, 所以他想通过调整参数 W 的值, 让检验结果尽可能的靠近标准 值 S,即使得 S-Y 的绝对值最小。请你帮忙求出这个最小值。 【输入】 输入文件 qc.in。 第一行包含三个整数 n,m,S,分别表示矿石的个数、区间的个数和标准值。 接下来的 n 行,每行 2 个整数,中间用空格隔开,第 i+1 行表示 i 号矿石的重量 wi 和 价值 vi 。 接下来的 m 行, 表示区间, 每行 2 个整数, 中间用空格隔开, 第 i+n+1 行表示区间[Li,Ri] 的两个端点 Li 和 Ri。注意:不同区间可能重合或相互重叠。 【输出】 输出文件名为 qc.out。 输出只有一行,包含一个整数,表示所求的最小值。 【输入输出样例】 qc.in qc.out 5 3 15 15 25 35 45 10 55 15 24 33 【输入输出样例说明】 当 W 选 4 的时候,三个区间上检验值分别为 20、5、0,这批矿产的检验结果为 25,此 时与标准值 S 相差最小为 10。 【数据范围】 对于 10%的数据,有 1?n,m?10; 对于 30%的数据,有 1?n,m?500; 对于 50%的数据,有 1?n,m?5,000; 对于 70%的数据,有 1?n,m?10,000; 对于 100%的数据,有 1?n,m?200,000,0 < wi, vi?106,0 < S?10^12,1?Li?Ri ?n。

第 68 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

3、观光公交
【问题描述】 风景迷人的小城 Y 市,拥有 n 个美丽的景点。由于慕名而来的游客越来越多,Y 市特 意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第 0 分钟出现在 1 号景点, 随后依次前往 2、 3、 4??n 号景点。 从第 i 号景点开到第 i+1 号景点需要 Di 分钟。 任意时刻,公交车只能往前开,或在景点处等待。 设共有 m 个游客,每位游客需要乘车 1 次从一个景点到达另一个景点,第 i 位游客在 Ti 分钟来到景点 Ai,希望乘车前往景点 Bi(Ai<Bi) 。为了使所有乘客都能顺利到达目的地, 公交车在每站都必须等待需要从该景点出发的所有乘客都上车后才能出发开往下一景点。假 设乘客上下车不需要时间。 一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻。因为只有一 辆观光车,有时候还要停下来等其他乘客,乘客们纷纷抱怨旅行时间太长了。于是聪明的司 机 ZZ 给公交车安装了 k 个氮气加速器,每使用一个加速器,可以使其中一个 Di 减 1。对 于同一个 Di 可以重复使用加速器,但是必须保证使用后 Di 大于等于 0。 那么 ZZ 该如何安排使用加速器,才能使所有乘客的旅行时间总和最小? 【输入】 输入文件名为 bus.in。 第 1 行是 3 个整数 n, m, k,每两个整数之间用一个空格隔开。分别表示景点数、乘客 数和氮气加速器个数。 第 2 行是 n-1 个整数, 每两个整数之间用一个空格隔开, 第 i 个数表示从第 i 个景点开 往第 i+1 个景点所需要的时间,即 Di。 第 3 行至 m+2 行每行 3 个整数 Ti, Ai, Bi,每两个整数之间用一个空格隔开。第 i+2 行 表示第 i 位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。 【输出】 输出文件名为 bus.out。共一行,包含一个整数,表示最小的总旅行时间。 【输入输出样例】 bus.in 332 14 013 112 523

bus.out

10

【输入输出样例说明】 对 D2 使用 2 个加速器,从 2 号景点到 3 号景点时间变为 2 分钟。 公交车在第 1 分钟从 1 号景点出发,第 2 分钟到达 2 号景点,第 5 分钟从 2 号景点 出发,第 7 分钟到达 3 号景点。 第 1 个旅客旅行时间 7-0 = 7 分钟。 第 2 个旅客旅行时间 2-1 = 1 分钟。 第 3 个旅客旅行时间 7-5 = 2 分钟。 总时间 7+1+2 = 10 分钟。 【数据范围】 对于 10%的数据,k=0; 对于 20%的数据,k=1; 对于 40%的数据,2 ? n ? 50,1 ? m? 1,000,0 ? k ? 20,0 ? Di ? 10,0 ? Ti ? 500; 对于 60%的数据,1 ? n ? 100,1 ? m? 1,000,0 ? k ? 100,0 ? Di ? 100, 0 ? Ti ? 10,000;
第 69 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

对于 100%的数据,1 ? n ? 1,000,1 ? m ? 10,000,0 ? k ? 100,000,0 ? Di ? 100,0 ? Ti ? 100,000。

全国信息学奥林匹克联赛(NOIP2012)复赛 提高组 Day1
一. 题目概况

第 70 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

二.

提交源程序文件名

三.

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

四.

运行内存限制

注意事项: 1、 文件名(程序名和输入输出文件名)必须使用英文小写。 2、 C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3、 全国统一评测时采用的机器配置为:CPU Intel Core2 Quad Q8200 2.33GHz,内存 2G, 上述时限以此配置为准。 4、 特别提醒:评测在 NOI Linux 下进行。

1.Vigenère 密码

(vigenere .cpp/c/pas)

【问题描述】 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法——Vigenère 密 码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南 军所广泛使用。 在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用 C 表示;而密钥是一种参数, 是将明文转换为密文或将密文转换为明文的算法中输入的数据, 记为 k。 在 Vigenère 密码中, 密钥 k 是一个字母串, k=k1k2…kn。当明文 M=m1m2? mn 时,得到的密文 C=c1c2…cn,其中 ci=mi?ki,运算?的规则如下表所示:

第 71 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

Vigenère 加密在操作时需要注意: 1. ?运算忽略参与运算的字母的大小写,并保持字母在明文 M 中的大小写形式; 2. 当明文 M 的长度大于密钥 k 的长度时,将密钥 k 重复使用。 例如,明文 M=Helloworld,密钥 k=abc 时,密文 C=Hfnlpyosnd。

【输入】 输入文件名为 vigenere.in。 输入共 2 行。 第一行为一个字符串,表示密钥 k,长度不超过 100,其中仅包含大小写字母。 第二行为一个字符串, 表示经加密后的密文, 长度不超过 1000, 其中仅包含大小写字母。 【输出】 输出文件名为 vigenere.out。 输出共 1 行,一个字符串,表示输入密钥和密文所对应的明文。 【输入输出样例】

【数据说明】 对于 100%的数据,输入的密钥的长度不超过 100,输入的密文的长度不超过 1000,且 都仅包含英文字母。

第 72 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

2.国王游戏(game.cpp/c/pas)
【问题描述】 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右 手上面分别写下一个整数,国王自己也在左、 右手上各写一个整数。然后, 让这 n 位大臣 排成一排,国王站在队伍的最前面。 排好队后,所有的大臣都会获得国王奖赏的若干金币, 每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果。 国王不希望某一个大臣获得特别多的奖赏, 所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。 【输入】 输入文件为 game.in。 第一行包含一个整数 n,表示大臣的人数。 第二行包含两个整数 a 和 b, 之间用一个空格隔开, 分别表示国王左手和右手上的整数。 接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左 手和右手上的整数。 【输出】 输出文件名为 game.out。 输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金 币数。 【输入输出样例】

【输入输出样例说明】 按 1、2、3 号大臣这样排列队伍,获得奖赏最多的大臣所获得金币数为 2; 按 1、3、2 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2; 按 2、1、3 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2; 按 2、3、1 这样排列队伍,获得奖赏最多的大臣所获得金币数为 9;
第 73 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

按 3、1、2 这样排列队伍,获得奖赏最多的大臣所获得金币数为 2; 按 3、2、1 这样排列队伍,获得奖赏最多的大臣所获得金币数为 9。 因此,奖赏最多的大臣最少获得 2 个金币,答案输出 2。 【数据范围】 对于 20%的数据,有 1? n? 10,0 < a、b < 8; 对于 40%的数据,有 1? n?20,0 < a、b < 8; 对于 60%的数据,有 1? n?100; 对于 60%的数据,保证答案不超过 10^9; 对于 100%的数据,有 1 ? n ?1,000,0 < a、b < 10000。

3.开车旅行(drive.cpp/c/pas) 【问题描述】 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小 的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度 为 Hi , 城市 i 和城市 j 之间的距离 d[i,j] 恰好是这两个城市海拔高度之差的绝对值, 即 d[i, j] = |? |。 旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次。他们计 划选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行。小 A 和 小 B 的驾驶风格不同, 小 B 总是沿着前进方向选择一个最近的城市作为目的地, 而小 A 总 是沿着前进方向选择第二近的城市作为目的地(注意:本题中如果当前城市到两个城市的距 离相同,则认为离海拔低的那个城市更近) 。如果其中任何一人无法按照自己的原则选择目的 城市,或者到达目的地会使行驶的总距离超出 X 公里,他们就会结束旅行。 在启程之前,小 A 想知道两个问题: 1.对于一个给定的 X=X 0,从哪一个城市出发,小 A 开车行驶的路程总数与小 B 行驶的路程总数的比值最小 (如果小 B 的行驶路程为 0, 此时的比值可视为无穷大, 且两个无穷大视为相等) 。 如 果从多个城市出发,小 A 开车行驶的路程总数与小 B 行驶的路程总数的比值都最小,则输 出海拔最高的那个城市。 2. 对任意给定的 X=Xi 和出发城市 Si,小 A 开车行驶的路程总数以及小 B 行驶的 路程 总数。 【输入】 输入文件为 drive.in。 第一行包含一个整数 N,表示城市的数目。 第二行有 N 个整数,每两个整数之间用一个空格隔开,依次表示城市 1 到城市 N 的 海拔高度,即 H1,H2,??,Hn,且每个 Hi 都是不同的。 第三行包含一个整数 X0。 第四行为一个整数 M,表示给定 M 组 Si 和 Xi。 接下来的 M 行,每行包含 2 个整数 Si 和 Xi,表示从城市 Si 出发,最多行驶 Xi 公 里。 【输出】 输出文件为 drive.out。 输出共 M+1 行。 第一行包含一个整数 S0,表示对于给定的 X0,从编号为 S0 的城市出发, 小 A 开车 行驶 的路程总数与小 B 行驶的路程总数的比值最小。 接下来的 M 行,每行包含 2 个整数,之间用一个空格隔开,依次表示在给定的 Si 和 Xi 下小 A 行驶的里程总数和小 B 行驶的里程总数。 【输入输出样例 1】
第 74 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入输出样例 1 说明】

各个城市的海拔高度以及两个城市间的距离如上图所示。 如果从城市 1 出发, 可以到达的城市为 2,3,4,这几个城市与城市 1 的距离分别为 1,1,2,但是由于城市 3 的海拔高度低于城市 2,所以我们认为城市 3 离城市 1 最近,城市 2 离城市 1 第二近,所以小 A 会走到城市 2。到达城市 2 后,前面可以到达的城市为 3,4, 这两个城市与城市 2 的距离分别为 2,1,所以城市 4 离城市 2 最近,因此小 B 会走到城 市 4。到达城市 4 后,前面已没有可到达的城市,所以旅行结束。 如果从城市 2 出发, 可以到达的城市为 3,4,这两个城市与城市 2 的距离分别为 2,1, 由于城市 3 离城市 2 第二近,所以小 A 会走到城市 3。到达城市 3 后, 前面尚未旅行的 城市为 4,所以城市 4 离城市 3 最近,但是如果要到达城市 4,则总路程为 2+3=5>3,所 以小 B 会直接在城市 3 结束旅行。 如果从城市 3 出发,可以到达的城市为 4,由于没有离城市 3 第二近的城市,因此旅 行还未开始就结束了。 如果从城市 4 出发,没有可以到达的城市,因此旅行还未开始就结束了。 【输入输出样例 2】

第 75 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入输出样例 2 说明】 当 X=7 时, 如果从城市 1 出发,则路线为 1 -> 2 -> 3 -> 8 -> 9,小 A 走的距离为 1+2=3,小 B 走 的距离为 1+1=2。 (在城市 1 时,距离小 A 最近的城市是 2 和 6,但是城市 2 的海拔更 高,视为与城市 1 第二近的城市,所以小 A 最终选择城市 2;走到 9 后,小 A 只有城市 10 可以走,没有第 2 选择可以选,所以没法做出选择,结束旅行) 如果从城市 2 出发,则路线为 2 -> 6 -> 7 ,小 A 和小 B 走的距离分别为 2,4。 如果从城市 3 出发,则路线为 3 -> 8 -> 9,小 A 和小 B 走的距离分别为 2,1。 如果从城市 4 出发,则路线为 4 -> 6 -> 7,小 A 和小 B 走的距离分别为 2,4。 如果从城市 5 出发,则路线为 5 -> 7 -> 8 ,小 A 和小 B 走的距离分别为 5,1。 如果从城市 6 出发,则路线为 6 -> 8 -> 9,小 A 和小 B 走的距离分别为 5,1。 如果从城市 7 出发,则路线为 7 -> 9 -> 10,小 A 和小 B 走的距离分别为 2,1。 如果从城市 8 出发,则路线为 8 -> 10,小 A 和小 B 走的距离分别为 2,0。 如果从城市 9 出发,则路线为 9,小 A 和小 B 走的距离分别为 0,0(旅行一开始就 结束了) 。 如果从城市 10 出发,则路线为 10,小 A 和小 B 走的距离分别为 0,0。 从城市 2 或者城市 4 出发小 A 行驶的路程总数与小 B 行驶的路程总数的比值都最 小,但是城市 2 的海拔更高,所以输出第一行为 2。 【数据范围】 对于 30%的数据,有 1?N?20,1?M?20; 对于 40%的数据,有 1?N?100,1?M?100; 对于 50%的数据,有 1?N?100,1?M?1,000; 对于 70%的数据,有 1?N?1,000,1?M?10,000; 对 于 100% 的 数 据 , 有 1 ? N ? 100,000 , 1 ? M ? 10,000 , -1,000,000,000 ? Hi ? 1,000,000,000,0?X0?1,000,000,000,1?Si?N,0?Xi?1,000,000,000,数据保证 Hi 互不 相同。

提高组 Day2
一. 题目概况

二.

提交源程序文件名

第 76 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

三.

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

四.

运行内存限

注意事项: 1、 文件名(程序名和输入输出文件名)必须使用英文小写。 2、 C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值为 0。 3、 全国统一评测时采用的机器配置为:CPU Intel Core2 Quad Q8200 2.33GHz,内存 2G, 上述时限以此配置为准。 4、 特别提醒:评测在 NOI Linux 下进行。

1.同余方程(mod.cpp/c/pas)
【问题描述】 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。 【输入】 输入文件为 mod.in。 输入只有一行,包含两个正整数 a, b,用一个空格隔开。 【输出】 输出文件为 mod.out。 输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。 【输入输出样例】

【数据范围】 对于 40%的数据,2 ?b? 1,000; 对于 60%的数据,2 ?b? 50,000,000; 对于 100%的数据,2 ?a, b? 2,000,000,000。

第 77 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

2.借教室(classroom.cpp/c/pas)
【问题描述】 在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海量租借教室的信息,我们自然希望编程解决这个问题。 我们需要处理接下来 n 天的借教室信息,其中第 i 天学校有 ri 个教室可供租借。共有 m 份订单, 每份订单用三个正整数描述, 分别为 dj, sj, tj , 表示某租借者需要从第 sj 天到第 tj 天 租借教室(包括第 sj 天和第 tj 天) ,每天需要租借 dj 个教室。 我们假定,租借者对教室的大小、地点没有要求。即对于每份订单,我们只需要每天提 供 dj 个教室,而它们具体是哪些教室,每天是否是相同的教室则不用考虑。 借教室的原则是先到先得,也就是说我们要按照订单的先后顺序依次为每份订单分配教 室。如果在分配的过程中遇到一份订单无法完全满足,则需要停止教室的分配,通知当前申 请人修改订单。这里的无法满足指从第 sj 天到第 tj 天中有至少一天剩余的教室数量不足 dj 个。 现在我们需要知道,是否会有订单无法完全满足。如果有,需要通知哪一个申请人修改 订单。 【输入】 输入文件为 classroom.in。 第一行包含两个正整数 n, m,表示天数和订单的数量。 第二行包含 n 个正整数,其中第 i 个数为 ri,表示第 i 天可用于租借的教室数量。 接下来有 m 行,每行包含三个正整数 dj, sj, tj ,表示租借的数量,租借开始、结束分别 在 第几天。 每行相邻的两个数之间均用一个空格隔开。天数与订单均用从 1 开始的整数编号。 【输出】 输出文件为 classroom.out。 如果所有订单均可满足,则输出只有一行,包含一个整数 0。否则(订单无法完全满足) 输出两行,第一行输出一个负整数-1,第二行输出需要修改订单的申请人编号。 【输入输出样例】

【输入输出样例说明】 第 1 份订单满足后,4 天剩余的教室数分别为 0,3,2,3。第 2 份订单要求第 2 天 到第 4 天每天提供 3 个教室,而第 3 天剩余的教室数为 2,因此无法满足。分配停止,通 知第 2 个申请人修改订单。 【数据范围】 对于 10%的数据,有 1 ? n, m ? 10; 对于 30%的数据,有 1 ? n, m ? 1000; 对于 70%的数据,有 1 ? n, m ? 10^5; 对于 100%的数据,有 1 ? n, m ? 10^6, 0 ? ri, dj? 10^9, 1 ? sj? tj? n。
第 78 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

3.疫情控制(blockade.cpp/c/pas)
【问题描述】 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是 首都,也是树中的根节点。 H 国的首都爆发了一种危害性极高的传染病。当局为了控制疫情, 不让疫情扩散到边 境城市(叶子节点所表示的城市) ,决定动用军队在一些城市建立检查点,使得从首都到边 境城市的每一条路径上都至少有一个检查点, 边境城市也可以建立检查点。 但特别要注意 的是,首都是不能建立检查点的。 现在,在 H 国的一些城市中已经驻扎有军队,且一个城市可以驻扎多个军队。一支军 队可以在有道路连接的城市间移动,并在除首都以外的任意一个城市建立检查点,且只能在 一个城市建立检查点。 一支军队经过一条道路从一个城市移动到另一个城市所需要的时间等 于道路的长度(单位:小时) 。 请问最少需要多少个小时才能控制疫情。注意:不同的军队可以同时移动。 【输入】 输入文件名为 blockade.in。 第一行一个整数 n,表示城市个数。 接下来的 n-1 行,每行 3 个整数,u、v、w,每两个整数之间用一个空格隔开,表示从 城市 u 到城市 v 有一条长为 w 的道路。数据保证输入的是一棵树,且根节点编号为 1。 接下来一行一个整数 m,表示军队个数。 接下来一行 m 个整数,每两个整数之间用一个空格隔开,分别表示这 m 个军队所驻扎 的城市的编号。 【输出】 输出文件为 blockade.out。 共一行,包含一个整数,表示控制疫情所需要的最少时间。如果无法控制疫情则输出-1。 【输入输出样例】

【输入输出样例说明】 第一支军队在 2 号点设立检查点,第二支军队从 2 号点移动到 3 号点设立检查点,所 需时间为 3 个小时。 【数据范围】 保证军队不会驻扎在首都。 对于 20%的数据,2? n? 10; 对于 40%的数据,2 ?n?50,0<w <105; 对于 60%的数据,2 ? n?1000,0<w <106; 对于 80%的数据,2 ? n?10,000; 对于 100%的数据,2?m?n?50,000,0<w <10^9。

第 79 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

全国信息学奥林匹克联赛(NOIP2013)复赛 提高组 Day1
一. 题目概

二.

提交源程序文件名

三.

编译命令(不包括任何优化开关)

注意事项: 1、 文件名(程序名和输入输出文件名)必须使用英文小写。 2、 C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3、 全 国 统 一 评 测 时 采 用 的 机 器 配 置 : CPU AMD Athlon(tm)64x2 Dual Core CPU 5200+,2.7GHz,内存 2G,上述时限以此配置为准。 4、 只提供 Linux 格式附加样例文件。 5、 特别提醒:评测在 NOI Linux 下进行。

1.转圈游戏(circle.cpp/c/pas)
【问题描述】 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏。按照顺时针方向给 n 个位置编号, 从 0 到 n-1。最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,??, 依此类推。 游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置 小伙伴走到第 m+1 号位置,??,依此类推,第 n ? m 号位置上的小伙伴走到第 0 号位置, 第 n-m+1 号位置上的小伙伴走到第 1 号位置,??,第 n-1 号位置上的小伙伴顺时针走到 第 m-1 号位置。 现在,一共进行了 10k 轮,请问 x 号小伙伴最后走到了第几号位置。
第 80 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入】 输入文件名为 circle.in。 输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。 【输出】 输出文件名为 circle.out。 输出共 1 行,包含 1 个整数,表示 10k 轮后 x 号小伙伴所在的位置编号。 【输入输出样例】

【数据说明】 对于 30%的数据,0 < < 7; 对于 80%的数据,0 < < 10^7; 对于 100%的数据,1 < < 1,000,000,0 < < ,1 ? x ? n,0 < < 10/69。

2.火柴排队(match.cpp/c/pas)
【问题描述】 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴 各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑ (? )2 ni=1 ,其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的 高度。 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最 小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小 交换次数对 99,999,997 取模的结果。 【输入】 输入文件为 match.in。 共三行,第一行包含一个整数 n,表示每盒中火柴的数目。 第二行有 n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。 第三行有 n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。 【输出】 输出文件为 match.out。 输出共一行,包含一个整数,表示最少交换次数对 99,999,997 取模的结果。 【输入输出样例 1】

第 81 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入输出样例说明】 最小距离是 0, 最少需要交换 1 次, 比如: 交换第 1 列的前 2 根火柴或者交换第 2 列 的前 2 根火柴。 【输入输出样例 2】

【输入输出样例说明】 最小距离是 10,最少需要交换 2 次,比如:交换第 1 列的中间 2 根火柴的位置,再 交换第 2 列中后 2 根火柴的位置。 【数据范围】 对于 10%的数据, 1 ? n ? 10; 对于 30%的数据,1 ? n ? 100; 对于 60%的数据,1 ? n ? 1,000; 对于 100%的数据,1 ? n ? 100,000,0 ?火柴高度? 231? 1。

3.货车运输(truck.cpp/c/pas)
【问题描述】 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都 有重量限制,简称限重。现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆 限重的情况下,最多能运多重的货物。 【输入】 输入文件名为 truck.in。 输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条 道路。 接下来 m 行每行 3 个整数 x、 y、 z,每两个整数之间用一个空格隔开,表示从 x 号 城市到 y 号城市有一条限重为 z 的道路。注意:x 不等于 y,两座城市之间可能有多条道 路。 接下来一行有一个整数 q,表示有 q 辆货车需要运货。 接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市 运输货物到 y 城市,注意:x 不等于 y。 【输出】 输出文件名为 truck.out。 输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货车 不能到达目的地,输出-1。 【输入输出样例】

第 82 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【数据说明】 对于 30%的数据,0 < < 1,000,0 < < 10,000,0 < < 1,000; 对于 60%的数据,0 < < 1,000,0 < < 50,000,0 < < 1,000; 对于 100%的数据, 0 < < 10,000, 0 < < 50,000, 0 < < 30,000, 0 ? z ? 100,000。

提高组 Day2
一. 题目概况

二.提交源程序文件名

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

第 83 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

注意事项: 1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3 、 全 国 统 一 评 测 时 采 用 的 机 器 配 置 : CPU AMD Athlon(tm)64x2 Dual Core CPU 5200+,2.7GHz,内存 2G,上述时限以此配置为准。 4、只提供 Linux 格式附加样例文件。 5、特别提醒:评测在 NOI Linux 下进行。

1.积木大赛(block.cpp/c/pas)
【题目描述】春春幼儿园举办了一年一度的“积木大赛” 。今年比赛的内容是搭建一座宽度为 的大 厦,大厦可以看成由块宽度为 1 的积木组成,第块积木的最终高度需要是 ? 。 在搭建开始之前,没有任何积木(可以看成块高度为 0 的积木) 。接下来每次操作,小 朋友们可以选择一段连续区间[, ],然后将第块到第块之间(含第 L 块和第 R 块)所 有积木的高度分别增加 1。 小是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数 最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次 数。 【输入】 输入文件为 block.in 输入包含两行,第一行包含一个整数,表示大厦的宽度。 第二行包含个整数,第个整数为 ? 。 【输出】 输出文件为 block.out 仅一行,即建造所需的最少操作数。 【输入输出样例】

【样例解释】 其中一种可行的最佳方案,依次选择 [1,5] [1,3] [2,3] [3,3] [5,5] 【数据范围】 对于 30%的数据,有 1 ? ? 10; 对于 70%的数据,有 1 ? ? 1000; 对于 100%的数据,有 1 ? ? 100000,0 ? ?? 10000。

第 84 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

2.花匠(flower.cpp/c/pas)
【问题描述】 花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定 把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希 望剩下的花排列得比较别致。 具体而言,栋栋的花的高度可以看成一列整数 ?1, ?2, … , ?。设当一部分花被移走后, 剩下的花的高度依次为1, 2, … , ,则栋栋希望下面两个条件中至少有一个满足: 条件 A:对于所有的,2> 2?1,且2> 2+1; 条件 B:对于所有的,2< 2?1,且2< 2+1。 注意上面两个条件在 = 1 时同时满足,当 > 1 时最多有一个能满足。 请问,栋栋最多能将多少株花留在原地。 【输入】 输入文件为 flower .in。 输入的第一行包含一个整数,表示开始时花的株数。 第二行包含个整数,依次为 ?1, ?2, … , ?,表示每株花的高度。 【输出】 输出文件为 flower .out。 输出一行,包含一个整数,表示最多能留在原地的花的株数。 【输入输出样例】

【输入输出样例说明】 有多种方法可以正好保留 3 株花,例如,留下第 1、4、5 株,高度分别为 5、1、2, 满足条件 B。 【数据范围】 对于 20%的数据, ? 10; 对于 30%的数据, ? 25; 对于 70%的数据, ? 1000,0 ? ?? 1000; 对于 100%的数据,1 ? ? 100,000,0 ? ?? 1,000,000,所有的 ? 随机生成,所 有随机数服从某区间内的均匀分布。

3.华容道(puzzle.cpp/c/pas)
【问题描述】 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次。于是,他想到用编 程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多 少时间。 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的:
第 85 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1 个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的; 2. 有些棋子是固定的,有些棋子则是可以移动的; 3. 任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白格子上。 游戏的目的是把某个指定位置可以活动的棋子移动到目标位置。 给定一个棋盘,游戏可以玩 q 次,当然,每次棋盘上固定的格子是不会变的, 但是棋 盘上空白的格子的初始位置、 指定的可移动的棋子的初始位置和目标位置却可能不同。第 i 次玩的时候, 空白的格子在第 EXi 行第 EYi 列,指定的可移动棋子的初始位置为第 SXi 行第 SYi 列,目标位置为第 TXi 行第 TYi 列。 假设小 B 每秒钟能进行一次移动棋子的操作, 而其他操作的时间都可以忽略不计。 请你 告诉小 B 每一次游戏所需要的最少时间,或者告诉他不可能完成游戏。 【输入】 输入文件为 puzzle.in。 第一行有 3 个整数,每两个整数之间用一个空格隔开,依次表示 n、m 和 q; 接下来的 n 行描述一个 n*m 的棋盘,每行有 m 个整数,每两个整数之间用一个空格 隔开,每个整数描述棋盘上一个格子的状态,0 表示该格子上的棋子是固定的,1 表示该格 子上的棋子可以移动或者该格子是空白的。 接下来的 q 行,每行包含 6 个整数依次是 EXi、EYi、SXi、SYi、TXi、TYi,每两个 整数之间用一个空格隔开,表示每次游戏空白格子的位置,指定棋子的初始位置和目标位置。 【输出】 输出文件名为 puzzle.out。 输出有 q 行,每行包含 1 个整数,表示每次游戏所需要的最少时间,如果某次游戏无 法完成目标则输出?1。 【输入输出样例】

1.

【输入输出样例说明】 棋盘上划叉的格子是固定的,红色格子是目标位置,圆圈表示棋子,其中绿色圆圈表示 目标棋子。 1. 第一次游戏,空白格子的初始位置是 (3, 2)(图中空白所示) ,游戏的目标是将初 始位置在(1, 2)上的棋子(图中绿色圆圈所代表的棋子)移动到目标位置(2, 2)(图中红色的格 子)上。 移动过程如下:

2.

第二次游戏,空白格子的初始位置是(1, 2) (图中空白所示) ,游戏的目标是将初始
第 86 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

位置在(2, 2)上的棋子(图中绿色圆圈所示)移动到目标位置 (3, 2)上。

要将指定块移入目标位置,必须先将空白块移入目标位置,空白块要移动到目标位置, 必然是从位置(2, 2)上与当前图中目标位置上的棋子交换位置,之后能与空白块交换位置 的只有当前图中目标位置上的那个棋子,因此目标棋子永远无法走到它的目标位置, 游戏无 法完成。 【数据范围】 对于 30%的数据,1 ? n, m ? 10,q = 1; 对于 60%的数据,1 ? n, m ? 30,q ? 10; 对于 100%的数据,1 ? n, m ? 30,q ? 500。

第 87 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 88 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 89 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 90 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 91 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 92 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 93 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 94 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 95 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

第 96 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

CCF 全国信息学奥林匹克联赛(NOIP2015)复赛
第 97 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

提高组 day1
(请选手务必仔细阅读本页内容)
一.题目概况 中文题目名称 英文题目与子目录名 可执行文件名 输入文件名 输出文件名 每个测试点时限 测试点数目 每个测试点分值 附加样例文件 结果比较方式 题目类型 运行内存上限 神奇的幻方 信息传递 斗地主 magic message landlords magic message landlords magic.in message.in landlords.in magic.out message.out landlords.out 1 秒 1 秒 2 秒 10 10 20 10 10 5 有 有 有 全文比较(过滤行末空格及文末回车) 传统 传统 传统 128M 128M 1G

二.提交源程序文件名 对于 C++语言 magic.cpp 对于 C 语言 magic.c 对于 pascal 语言 magic.pas 三.编译命令(不包含任何优化开关) g++ -o magic 对于 C++语言 magic.cpp -lm gcc -o magic 对于 C 语言 magic.c -lm 对于 pascal 语言 fpc magic.pas

message.cpp message.c message.pas

landlords.cpp landlords.c landlords.pas

g++ -o message g++ -o landlords message.cpp -lm landlords.cpp -lm gcc -o message gcc -o landlords message.c -lm landlords.c -lm fpc message.pas fpc landlords.pas

注意事项: 1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必 须是 0。 3、 全国统一评测时采用的机器配置为: CPU AMD Athlon(tm) II x2 240 processor, 2.8GHz,内存 4G,上述时限以此配置为准。 4、只提供 Linux 格式附加样例文件。 5、特别提醒:评测在当前最新公布的 NOI Linux 下进行,各语言的编译器版本 以其为准。

第 98 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

1.神奇的幻方
(magic.cpp/c/pas) 【问题描述】 幻方是一种很神奇的 N*N 矩阵:它由数字 1,2,3, ? ? , N*N 构成,且每 行、每列及两条对角线上的数字之和都相同。 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将 1 写在第一行的中间。 之后,按如下方式从小到大依次填写每个数K(K= 2,3, ? , N*N ): 1. 若 (K?1) 在第一行但不在最后一列,则将K填在最后一行,(K? 1) 所在 列的右一列; 2. 若 (K? 1) 在最后一列但不在第一行,则将K填在第一列,(K? 1) 所在 行的上一行; 3. 若 (K? 1) 在第一行最后一列,则将K填在 (K? 1) 的正下方; 4. 若 (K? 1) 既不在第一行,也不在最后一列,如果 (K? 1) 的右上方还未 填数, 则将K填在(K? 1)的右上方,否则将K填在 (K? 1) 的正下方 现给定N,请按上述方法构造 N*N 的幻方。 【输入格式】 输入文件名为 magic.in。 输入文件只有一行,包含一个整数N,即幻方的大小。 【输出格式】 输出文件名为 magic.out。 输出文件包含N行, 每行N个整数, 即按上述方法构造出的N*N的幻方。 相邻 两 个整数之间用单个空格隔开。 【输入输出样例 1】 magic.in 3

magic.out 8 1 6 3 5 7 4 9 2

见选手目录下的 magic/magic1.in 和 magic/magic1.ans。 【输入输出样例 2】 见选手目录下的 magic/magic2.in 和 magic/magic2.ans。 【数据规模与约定】 对于 100% 的数据,1 ?N?39 且N为奇数。

第 99 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

2.信息传递
(message.cpp/c/pas) 【问题描述】 有 n 个同学(编号为 1 到 n)正在玩一个信息传递的游戏。在游戏里每人 都有一个固定的信息传递对象, 其中, 编号为 i 的同学的信息传递对象是编号为 Ti 的同学。 游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会 同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以 从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对 象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一共可以进 行几轮? 【输入格式】 输入文件名为 message.in。 输入共 2 行。 第 1 行包含 1 个正整数 n ,表示 n 个人。 第 2 行包含 n 个用空格隔开的正整数T1,T2,? ,Tn, 其中第Ti个整数表示编 号为 i 的同学的信息传递对象是编号为 Ti 的同学,Ti ?n 且Ti ≠i。 数据保证游戏一定会结束。 【输出格式】 输出文件名为 message.out。 输出共 1 行,包含 1 个整数,表示游戏一共可以进行多少轮。 【输入输出样例 1】 message.in message.out 5 3 2 4 2 3 1 见选手目录下的 message/message1.in 与 message/message1.ans。 【输入输出样例 1 说明】

游戏的流程如图所示。 当进行完第 3 轮游戏后, 4 号玩家会听到 2 号玩家告 诉他自己的生日,所以答案为 3。当然,第 3 轮游戏后,2 号玩家、3 号玩家都 能从自己的消息 来源得知自己的生日,同样符合游戏结束的条件。 【样例输入输出 2】 见选手目录下的 message/message2.in 与 message/message2.ans。 【数据规模与约定】 对于 30%的数据 n ?200; 对于 60%的数据,n ? 2500;
第 100 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

对于 100%的数据,n ? 200000。

第 101 页 共 113 页

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

3. 斗地主
(landlords.cpp/c/pas) 【问题描述】 牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、 梅花、 方片的 A 到 K 加上大小王的共 54 张牌来进行的扑克牌游戏。在斗地 主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<8<9<10<J<Q<K<A<2<小 王<大王,而花色并不对牌的大小产生影响。每一局游戏中,一副手牌由 n 张牌 组成。 游戏者每次可以根据规定的牌型进行出牌, 首先打光自己的手牌一方取得 游戏的胜利。 现在,牛牛只想知道,对于自己的若干组手牌,分别最少需要多少次出牌可 以将它们打光。请你帮他解决这个问题。 需要注意的是, 本题中游戏者每次可以出手的牌型与一般的斗地主相似而略 有不同。具体规则如下: 牌型 牌型说明 牌型举例照片 即双王(双鬼牌)。 火箭 炸弹 单张牌 对子牌 三张牌 三带一 三带二 四张同点牌。如四个 A。 单张牌,比如 3。 两张码数相同的牌。 三张码数相同的牌。 三张码数相同的牌 + 一张单牌。 例如: 三张3+单4 三张码数相同的牌 + 一对牌。例如: 三张3+对4 五张或更多码数连续的单牌 (不包括 2 点和双王)例如:单 7+单 8+单 9+单 10+单 J。另外,在顺牌(单顺子、双 顺子、三顺子)中,牌的花色不要求相 同。 三对或更多码数连续的对牌 (不包括 2 点和双王)。例如:对3+对4+对5。 二个或更多码数连续的三张牌 (不能包 括 2 点和双王)。例如:三张 3+三张 4+三张 5。 四张码数相同的牌+任意两张单牌(或 任意两对牌)例如:四张 5+单 3+单 8 或 四张 4+对 5+对 7
102

单顺子

双顺子 三顺子

四带二

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【输入格式】 输入文件名为 landlords.in。 第一行包含用空格隔开的2个正整数T,n,表示手牌的组数以及每组手牌的张 数。 接下来T组数据,每组数据n行,每行一个非负整数对ai,bi,表示一张牌, 其中ai表示牌的数码, bi表示牌的花色, 中间用空格隔开。 特别的, 我们用 1 来 表示数码 A,11 表示数码 J,12 表示数码 Q,13 表示数码 K;黑桃、红心、 梅花、 方片分别用 1-4 来表示; 小王的表示方法为 0 1, 大王的表示方法为 0 2。 【输出格式】 输出文件名为 landlords.out。 共 T 行,每行一个整数,表示打光第i组手牌的最少次数。 【输入输出样例 1】 landlords.in 1 8 7 4 8 4 9 1 10 4 11 1 5 1 1 4 11 landlords.out 3

见选手目录下的 landlords/landlords1.in 与 landlords/landlords1.ans。 【输入输出样例 1 说明】 共有 1 组手牌,包含 8 张牌:方片7,方片8,黑桃9,方片10,黑桃J,黑 桃5,方片A 以及黑桃A。可以通过打单顺子(方片7,方片8,黑桃9,方片10, 黑桃J),单张牌(黑桃5)以及对子牌(黑桃A 以及方片A)在3次内打光。 【输入输出样例 2】 landlords.in 1 17 12 3 4 3 2 3 5 4 10 2 3 3 12 2

landlords.out 6

103

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

0 1 1 3 10 1 6 2 12 1 11 3 5 2 12 4 2 2 7 2 见选手目录下的 landlords/landlords2.in 与 landlords/landlords2.ans。 【样例输入输出 3】 见选手目录下的 landlords/landlords3.in 与 landlords/landlords3.ans。 【数据规模与约定】 对于不同的测试点,我们约定手牌组数 与张数 的规模如下: 测试点编号 T n 测试点编号 T n 1 100 2 11 100 14 2 100 2 12 100 15 3 100 3 13 10 16 4 100 3 14 10 17 5 100 4 15 10 18 6 100 4 16 10 19 7 100 10 17 10 20 8 100 11 18 10 21 9 100 12 19 10 22 10 100 13 20 10 23 数据保证:所有的手牌都是随机生成的。

104

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

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

提高组 day2
(请选手务必仔细阅读本页内容)
一.题目概况
中文题目名称 英文题目与子目录名 可执行文件名 输入文件名 输出文件名 每个测试点时限 测试点数目 每个测试点分值 附加样例文件 跳石头 stone stone stone.in stone.out 1 秒 10 10 有 子串 substring substring substring.in substring.out 1 秒 10 10 有 运输计划 transport transport transport.in transport.out 1 秒 20 5 有

结果比较方式 题目类型 运行内存上限 传统

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

传统 128M

传统 256M

128M

105

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

二.提交源程序文件名
对于 C++语言 对于 C 语言 对于 pascal 语言 stone.cpp stone.c stone.pas substring.cpp substring.c substring.pas transport.cpp transport.c transport.pas

三.编译命令(不包含任何优化开关)
对于 C++语言 g++ -o stone stone.cpp -lm 对于 C 语言 gcc -o stone stone.c -lm 对于 pascal 语言 fpc stone.pas g++ -o substring substring.cpp -lm gcc -o substring substring.c -lm fpc substring.pas g++ -o transport transport.cpp -lm gcc -o transport transport.c -lm fpc transport.pas

注意事项:
1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须是 0。 3、全国统一评测时采用的机器配置为:CPU AMD Athlon(tm) II x2 240 processor,2.8GHz, 内存 4G,上述时限以此配置为准。 4、只提供 Linux 格式附加样例文件。 5、特别提醒:评测在当前最新公布的 NOI Linux 下进行,各语言的编译器版本以其为准。

106

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

1.跳石头
(stone.cpp/c/pas)

【问题描述】 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行, 河道中分布着一些巨大岩石。 组委会 已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石 (不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向 相邻的岩石,直至到达终点。 为了提高比赛难度, 组委会计划移走一些岩石, 使得选手们在比赛过程中的 最短跳跃距离尽可能长。 由于预算限制, 组委会至多从起点和终点之间移走 M 块 岩石(不能移走起点和终点的岩石)。 【输入格式】 输入文件名为 stone.in。 输入文件第一行包含三个整数 L,N,M,分别表示起点到终点的距离,起点 和终点之间的岩石数,以及组委会至多移走的岩石数。 接下来 N 行,每行一个整数,第 i 行的整数 Di(0 < Di < L)表示第 i 块 岩石与 起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两 个岩石出现在同一个位置。 【输出格式】 输出文件名为 stone.out。 输出文件只包含一个整数,即最短跳跃距离的最大值。 【输入输出样例 1】 stone.in stone.out 25 5 2 4 2 11 14 17 21 见选手目录下的 stone/stone1.in 和 stone/stone1.ans。 【输入输出样例 1 说明】 将与起点距离为 2 和 14 的两个岩石移走后,最短的跳跃距离为 4(从与 起点距离 17 的岩石跳到距离 21 的岩石,或者从距离 21 的岩石跳到终点)。 【输入输出样例 2】 见选手目录下的 stone/stone2.in 和 stone/stone2.ans。
107

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

【数据规模与约定】 对于 20%的数据,0 ? M ? N ? 10。 对于 50%的数据,0 ? M ? N ? 100。 对于 100%的数据,0 ? M ? N ? 50,000,1 ? L ? 1,000,000,000。

108

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

2.子串 (substring.cpp/c/pas) 【问题描述】 有两个仅包含小写英文字母的字符串A和B。 现在要从字符串A中取出k个互 不重叠的非空子串, 然后把这 k 个子串按照其在字符串 A 中出现的顺序依次 连接起来得到一个新的字符串, 请问有多少种方案可以使得这个新串与字符串 B 相等?注意:子串取出的位置不同也认为是不同的方案。 【输入格式】 输入文件名为 substring.in。 第一行是三个正整数 n,m,k,分别表示字符串 A 的长度,字符串 B 的长 度,以及问题描述中所提到的 k,每两个整数之间用一个空格隔开。 第二行包含一个长度为 n 的字符串,表示字符串A。 第三行包含一个长度为 m 的字符串,表示字符串B。 【输出格式】 输出文件名为 substring.out。 输出共一行,包含一个整数,表示所求方案数。由于答案可能很大,所 以这里要求输出答案对 1,000,000,007 取模的结果。 【输入输出样例 1】 substring.in 6 3 1 aabaab aab 2 substring.out

见选手目录下 substring/substring1.in 与 substring/substring1.ans。 【输入输出样例 2】 substring.in 6 3 2 aabaab aab 7 substring.out

见选手目录下 substring/substring2.in 与 substring/substring2.ans。 【输入输出样例 3】 substring.in substring.out

109

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

6 3 3 7 aabaab aab 见选手目录下 substring/substring3.in 与 substring/substring3.ans。

【输入输出样例说明】 所有合法方案如下:(加下划线的部分表示取出的子串) 样例 1:aab aab / aab aab 样例 2:a ab aab / a aba ab / a a ba ab / aab a ab aa b aab / aa baa b / aab aa b 样例 3:a a b aab / a a baa b / a ab a a b / a aba a b a a b a a b / a a ba a b / aab a a b 【输入输出样例 4】 见选手目录下 substring/substring4.in 与 substring/substring4.ans。 【数据规模与约定】 对于第 1 组数据:1?n?500,1?m?50,k=1; 对于第 2 组至第 3 组数据:1?n?500,1?m?50,k=2; 对于第 4 组至第 5 组数据:1?n?500,1?m?50,k=m; 对于第 1 组至第 7 组数据:1?n?500,1?m?50,1?k?m; 对于第 1 组至第 9 组数据:1?n?1000,1?m?100,1?k?m; 对于所有 10 组数据:1?n?1000,1?m?200,1?k?m。

110

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

3. 运输计划
(transport.cpp/c/pas) 【问题描述】 公元 2044 年,人类进入了宇宙纪元。 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间, 这 n-1 条航道连通了 L 国的所有星球。 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如: 有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显 然,飞船驶过一条航道是需要时间的,对于航道j,任意飞船驶过它所花费的时 间为 tj,并且任意两艘飞船之间不会产生任何干扰。 为了鼓励科技创新,L 国国王同意小 P 的物流公司参与 L 国的航道建设, 即允许小 P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。 在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。 在虫洞建设 完成后,这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划 都完成时,小 P 的 物流公司的阶段性工作就完成了。 如果小 P 可以自由选择将哪一条航道改造成虫洞, 试求出小 P 的物流公司 完成阶段性工作所需要的最短时间是多少? 【输入格式】 输入文件名为 transport.in。 第一行包括两个正整数 n、m,表示 L 国中星球的数量及小 P 公司预接的 运输计划的数量,星球从 1 到 n 编号。 接下来 n-1 行描述航道的建设情况,其中第 i 行包含三个整数 ai, bi 和 ti,表示第 i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所 花费的时间为 ti。 接下来 m 行描述运输计划的情况, 其中第 j 行包含两个正整数 uj 和 vj, 表示第 j 个 运输计划是从 uj 号星球飞往 vj 号星球。 【输出格式】 输出文件名为 transport.out。 共 1 行,包含 1 个整数,表示小 P 的物流公司完成阶段性工作所需要的 最短时间。 【输入输出样例 1】 transport.in

transport.out

111

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

6 1 1 3 4 3 3 2 4

3 2 6 1 3 5 6 5 5

11 3 4 7 6 5

见选手目录下的 transport/transport1.in 与 transport/transport1.ans。 【输入输出样例 1 说明】 将第 1 条航道改造成虫洞:则三个计划耗时分别为:11、12、11,故需要 花费的时间为 12。 将第 2 条航道改造成虫洞:则三个计划耗时分别为:7、15、11,故需要花 费的时间为 15。 将第 3 条航道改造成虫洞:则三个计划耗时分别为:4、8、11,故需要花 费的时间为 11。 将第 4 条航道改造成虫洞:则三个计划耗时分别为:11、15、5,故需要花 费的时间为 15。 将第 5 条航道改造成虫洞:则三个计划耗时分别为:11、10、6,故需要花 费的时间为 11。 故将第 3 条或第 5 条航道改造成虫洞均可使得完成阶段性工作的耗时最 短,需要花费的时间为 11。 【样例输入输出 2】 见选手目录下的 transport/transport2.in 与 transport/transport2.ans。 【数据规模与约定】 所有测试数据的范围和特点如下表所示 测试点编号 n= m= 约定 1 1 2 100 第 i 条航道连接 i 号星球与 i+1 号星球 100 3 4 2000 1 5 1000 1000 6 2000 2000 第 i 条航道连接 i 号星球与 i+1 号星球 7 3000 3000 8 1000 1000 9 2000 2000 10 3000 3000
112

全国信息学奥林匹克联赛(NOIP2015)复赛
提高组 day1

11 80000 1 12 100000 13 70000 70000 14 80000 80000 第 i 条航道连接 i 号星球与 i+1 号星球 15 90000 90000 16 100000 100000 17 80000 80000 18 90000 90000 19 100000 100000 20 300000 300000 所有数据 1?ai,bi,uj,vj?n,0?ti?1000 请注意常数因子带来的程序效率上的影响。

113


赞助商链接
更多相关文档:

历届noip提高组复赛试题

历届noip提高组复赛试题_学科竞赛_高中教育_教育专区 暂无评价|0人阅读|0次下载|举报文档历届noip提高组复赛试题_学科竞赛_高中教育_教育专区。NOI’95 “同创杯”...

1995-2008 历届NOIP试题及详解

1995-2008 历届NOIP试题及详解_学科竞赛_高中教育_教育专区。对历届(1995-2008)...提高组 复赛试题 第二届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 (...

NOIP历年复赛提高组试题

(NOIP1995)复赛试题(提高组 竞赛用时:3.5 小时) 1、编码问题设有一个数组 A...©2015 Baidu 使用百度前必读 | 文库协议 | 网站地图 关闭 ...

noip2015提高组复赛试题答案

noip2015提高组复赛试题答案_IT认证_资格考试/认证_教育专区。noip2015 提高组复赛试题答案一. 单项选择题 (共 20 题,每题 1.5 分,共计 30 分;每题有且仅...

NOIP历年复赛提高组试题(2004-2013)

NOIP历年复赛提高组试题(2004-2013)_学科竞赛_高中教育_教育专区。2004~2013 年...95 18 29 30 53 88 83 64 67 【限制】 60%的数据满足:1<=n, m<=30...

NOIP历年复赛提高组试题(2006-2014)

复赛试题集(提高组) Son.in 2 41 95 1 96 288 1 37 1776 Son.out 6 ...文档贡献者 lihua8741 贡献于2015-10-26 1/2 相关文档推荐 历届noip提高组...

noip2015提高组复赛试题答案

全国信息学奥林匹克联赛(NOIP2015)复赛 提高组 day1 CCF 全国信息学奥林匹克联赛(NOIP2015)复赛 提高组 day1 (请选手务必仔细阅读本页内容) 一.题目概况 中文...

NOIP历年试题选编(1995-2010)

1995-2010 年 NOIP 提高组 复赛试题 NOI’95 “同创杯”全国青少年信息学(...©2015 Baidu 使用百度前必读 | 文库协议 | 网站地图 ...

NOIP2000提高组复赛试题

NOIP1995提高组初赛试题 NOIP1995提高组复赛数据 NOIP1995提高组复赛试题 NOIP1995...历届noip提高组复赛试题 56页 免费 NOIP2000普及组初赛试题 8页 免费 noip2010...

NOIP2015提高组复赛试题Day1

全国信息学奥林匹克联赛(NOIP2015)复赛 提高组 day1 CCF 全国信息学奥林匹克联赛(NOIP2015)复赛 提高组day1 (请选手务必仔细阅读本页内容)一.题目概况 中文题目...

更多相关标签:
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com