当前位置:首页 >> 学科竞赛 >>

NOIP(1995-2010)提高组复赛试题






NOI‘95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛 ............................................................. 2 第二届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 ........................................

.................... 4 第三届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 ............................................................ 5 第四届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 ............................................................ 7 第五届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 ............................................................ 8 2000 年 ............................................................................................................................................................ 10 2001 年 ............................................................................................................................................................ 15 2002 年 ............................................................................................................................................................ 17 第九届全国青少年信息学奥林匹克联赛(N0IP2003) ............................................................................. 21 第十届全国青少年信息学奥林匹克联赛复赛试题...................................................................................... 25 2005 年 ............................................................................................................................................................ 31 NOIP2006 提高组复赛试题 ........................................................................................................................... 35 2007 年 ............................................................................................................................................................ 44 全国信息学奥林匹克联赛(NOIP2008)复赛 ............................................................................................ 50 2009 年 ............................................................................................................................................................ 56 2010 年 ............................................................................................................................................................ 60 2011 年 ............................................................................................................................ 错误!未定义书签。

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 R R B B B B B B B B B B B B B B B

R B-R 顺序 B B B B B B B B B B B B B B 放置的总数为 12 种。

R

B

B

B

R

R R R R R R R R R R

B B B B

R

数据输入的方式为: 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 产生)

第二届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(高中组 竞赛用时: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 进制的形式输 出。 例如:A$=‘48<10>8‘ 其意义为:将 10 进制数 48,转换成 8 进制数输出。 输出结果为:48<10>=60<8> 4.挖地雷(30 分) 在一个地图上有 N 个地窖(N<=20) ,每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接 路径。 例如: [题目要求] 当地窖及其连 V1 V 2 V3 V4 接 的 数 据 给 出 之 后,某人可以从任 V5 一处开始挖地雷, 然后可以沿着指出 的连接往下挖(仅能选择一条路径) ,当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖 到最多的地雷。 输入格式: 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 三种不同的重量。

第三届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(高中组 竞赛用时: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 16 13 6 2 15 4 7 11 8 9 10 12 5 14 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.式了中出现不允许的字符; 2.括号不配对; 3.其它错误。 例如:输入:a+(b); 输出:OK 例如:输入:a+(b+c*a; 输出: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)

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

1.火车从始发站(称为第 1 站)开出,在始发站上车的人数为 a,然后到达第 2 站,在第 2 站有人上、下 车,但上、下车的人数相同,因此在第 2 站开出时(即在到达第 3 站之前)车上的人数保持为 a 人。 从第 3 站起(包括第 3 站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下 车人数等于上一站上车人数,一直到终点站的前一站(第 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 个数 程序输出:联接成的多位数

{20%}

{40%}

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! ”

第五届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(提
第一题 拦截导弹(28 分)





竞赛用时:3 小时)

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然

它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到 敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于 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 分)

OUTPUT STEP=6

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的) 。给定两个 城市之间的距离 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 OUTPUT 26.95(该数据表示最小费用) 离出发点的距离 Di 102.0 220.0 每升汽油价格 Pi 2.9 2.2

第四题

邮票面值设计(40 分)

给定一个信封,最多只允许粘贴 N 张邮票,计算在给定 K(N+K≤40)种邮票的情况下(假定所有的邮 票数量都足够) ,如何设计邮票的面值,能得到最大值 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 年
题一
问题描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值 2 1 减1)为指数,以10为底数的幂之和的形式。例如:123可表示为 1*10 +2*10 +3*1 0 0 这样的形式。 与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的(值-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} ..

进制转换

(18 分)

输 入 输入的每行有两个输入数据。 第一个是十进制数N(-32768<=N<=32767) ;

第二个是负进制数的基数-R。

输 出 结果显示在屏幕上,相对于输入,应输出此负进制数及其基数,若此基数超过10,则参照16进制 的方式处理。 样 例 输入 30000 -2 -20000 -2 28800 -16 -25000 -16 输出 30000=11011010101110000(base -2) -20000=1111011000100000 (base -2) 28000=19180 (base -16) -25000=7FB8 (base -16)

提高组

题二

乘积最大

(22 分)

问题描述 今年是国际数学联盟确定的 “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 设计一个程序,求得正确的答案。 输 入

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





结果显示在屏幕上,相对于输入,应输出所求得的最大乘积(一个自然数) 。 样 输入 4 2 1231 输出 62 提高组 例

题三.

单词接龙

(27 分)

问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的 字母,要求出以这个字母开头的最长的“龙” (每个单词都最多在“龙”中出现两次) ,在两个单词相连时, 其重合部分合为一部分,例如 beast 和 astonish,如果接成一条龙则变为 beastonish,另外相邻的两部分不 能存在包含关系,例如 at 和 atide 间不能相连。 输 入

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

只需输出以此字母开头的最长的“龙”的长度 样 输入 5 at touch 例 :

cheat choose tact a 输出 23 (连成的“龙”为 atoucheatactactouchoose)

提高组

题四. 方格取数

(33 分)

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

某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点。在走过的 路上,他可以取走方格中的数(取走后的方格中将变为数字 0) 。 此人从 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 :

13 6 7 14 21 4 15 14 0

2001 年
题一 一元三次方程求解(20 分) 问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数), 并约定该方程存在三个不同实根(根的范围在-100 至 100 之间), 且根与根之差的绝对值>=1。 要求由小到大 依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 2 位。 提示:记方程 f(x)=0,若存在 2 个数 x1 和 x2,且 x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个 根。 样例 输入:1 -5 -4 20 输出:-2.00 2.00 5.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 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) 接下来的 s 行,每行均有一个单词。 输出格式 结果输出至屏幕,每行一个整数,分别对应每组测试数据的相应结果。

样例 输入: 1 13 thisisabookyouareaoh 4 is a ok sab 输出: //说明:(不必输出) 7 // this/isabookyoua/reaoh

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

机场 高速铁路 飞机航线

注意:图中并没有 标出所有的铁路与航线。

那么 Car 应如何安排到城市 B 的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题, 于是她来向你 请教。 任务 找出一条从城市 A 到 B 的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。 输入文件:键盘输入文件名 输 出:到屏幕(输出最小费用,小数点后保留 1 位。) 输入格式 第一行为一个正整数 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 个城市中任意三个机场的坐标,T I 为第 I 个城市高速铁路单位里程的价格。 输出格式 共有 n 行,每行一个数据对应测试数据。 样例 输入 1 1 10 1 3 1 1 1 3 3 1 30 2 5 7 4 5 2 1 8 6 8 8 11 6 3 输出: 47.55

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) 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 wyz abc xu ud y y yz 屏幕显示: 3

题三 自由落体(存盘名:NOIPG3) [问题描述]: 在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,?.n-1。在地面上有一个小车(长 为 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 个 矩形的面积之和为最小呢。约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为 0。 各个矩形必须完全分开(边线与顶点也都不能重合)。 [输入]: 键盘输人文件名。文件格式为 n k xl y1 x2 y2

... ... xn yn (0<=xi,yi<=500) [输出]: 输出至屏幕。格式为: 一个整数,即满足条件的最小的矩形面积之和。

[输入输出样例] d.in : 42 11 22 36 07 屏幕显示: 4

2003 年

第九届全国青少年信息学奥林匹克联赛(N0IP2003)
2003 年 11 月 29 日 提高组试题 试题输入:苏州高斌 大榕树 http://drs.126.com 三小时完成

题一

神经网络

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

神经元〔编号为 1) 图中,X1—X3 是信息输入渠道,Y1-Y2 是信息输出渠道,C1 表示神经元目前的状态, Ui 是阈值,可视为神经元的一个内在参数。 神经元按一定的顺序排列,构成整个神经网络。在兰兰的模型之中,神经网络中的神 经无分为几层;称为输入层、输出层,和若干个中间层。每层神经元只向下一层的神经元 输出信息,只从上一层神经元接受信息。下图是一个简单的三层神经网络的例子。

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

?

W ji C j ? U

i

( j , i )? E

公式中的 Wji(可能为负值)表示连接 j 号神经元和 i 号神经元的边的权值。当 Ci 大于 0 时,该神经 元处于兴奋状态,否则就处于平静状态。当神经元处于兴奋状态时,下一秒 它会向其他神经元传送信号,信号的强度为 Ci。 如此.在输入层神经元被激发之后,整个网络系统就在信息传输的推动下进行运作。 现在,给定一个神经网络,及当前输入层神经元的状态(Ci) ,要求你的程序运算出最后网 络输出层的状态。 【输入格式】 输入文件第一行是两个整数 n(1≤n≤20)和 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

题二

侦探推理

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

证词中出现的其他话,都不列入逻辑推理的内容。 明明所知道的是,他的同学中有 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,叶子的加分就是叶节点本身的分数。不考虑它的空 子树。 试求一棵符合中序遍历为(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 12 13 24 25 36 37 【输出样例】 3

2004 年

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

http://www.oifans.cn 一、津津的储蓄计划 (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 170

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

二、合并果子 (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<=10000), 表示果子的种类数。 第二行包含 n 个整数,用空格分隔,第 i 个整数 ai(1<=ai<=20000)是第 i 种果子的数目。 【输出文件】 输出文件 fruit.out 包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输 入数据保证这个值小于 231。 【样例输入】 3 1 2 9 【样例输出】 15 【数据规模】

对于 30%的数据,保证有 n<=1000: 对于 50%的数据,保证有 n<=5000; 对于全部的数据,保证有 n<=10000。 三、合唱队形 (chorus.pas/dpr/c/cpp) 【问题描述】 N 位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的 K 位同学排成合 唱队形。 合唱队形是指这样的一种队形:设 K 位同学从左到右依次编号为 1,2?,K,他们的身 高分别为 T1,T2,?,TK, 则他们的身高满足 T1<...<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。

四、虫食算 (alpha.pas/dpr/c/cpp) 【问题描述】 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判 定被啃掉的字母。来看一个简单的例子: 43#9865#045 8468#6633 44445506978

+

其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是 5 和 3,第二行的数字是 5。 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算。这里的加法是 N 进制加法,算式中三个数都有 N 位, 允许有前导的 0。

其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用 相同的字母表示,不同的数字用不同的字母表示。如果这个算式是 N 进制的,我们就取英文 字母表午的前 N 个大写字母来表示这个算式中的 0 到 N-1 这 N 个不同的数字:但是这 N 个字 母并不一定顺序地代表 0 到 N-1)。输入数据保证 N 个字母分别至少出现一次。

+

BADC CRDA 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 【样例输出】 1 0 3 4 2 【数据规模】 对于 30%的数据,保证有 N<=10; 对于 50%的数据,保证有 N<=15; 对于全部的数据,保证有 N<=26。

2005 年
第十一届全国青少年奥林匹克信息学联赛复赛提高组试题 (提高组 三小时完成) http://www.oifans.cn/

谁拿了最多奖学金
(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) 。每两个相邻 数据项之间用一个空格分隔。

【输出文件】 输出文件 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 只包括一个整数,表示青蛙过河最少需要踩到的石子数。 【样例输入】 10 235 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, ?? bm b2, –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。 【样例输入】 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 个字符,而且保证选项中总有表达式和题干中的表达式是等价的。 【输出文件】 输出文件 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%的数据,表达式中只可能出现两种运算符‘+’和‘-’ ; 对于其它的数据,四种运算符‘+’‘-’‘*’‘^’在表达式中都可能出现。 , , , 对于全部的数据,表达式中都可能出现小括号‘(’和‘)’ 。

NOIP2006 提高组复赛试题

竞赛时间:2006 年 11 月 18 日上午 8:30—11:30
试题名称 目录 输入文件 名 输出文件 名 试题类型 附加文件 时限 非交互式程序 题 无 1秒 非交互式程序题 无 1秒 非交互式程序题 无 1秒 非交互式程序题 无 1秒 energy.out budget.out jsp.out digital.out energy energy energy.in budget budget budget.in jsp jsp jsp.in digital digital digital.in

关于竞赛中不同语言使用限制的说明
一.关于使用 Pascal 语言与编译结果的说明 1.对于 Pascal 语言的程序,当使用 IDE 和 fpc 编译结果不一致时,以 fpc 的编译结果为准。 2.允许使用数学库(uses math 子句),以及 ansistring。但不允许使用编译开关(最后测 试时 pascal 的范围检查开关默认关闭:{$R-,Q-,S-}),也不支持与优化相关的选项。 二.关于 C++语言中模板使用的限制说明 1.允许使用的部分:

标准容器中的布尔集合,迭代器,串,流。 相关的头文件: 2.禁止使用的部分: 序列:vector,list,deque 序列适配器:stack, queue, priority_queue 关联容器:map, multimap, set, multiset 拟容器:valarray 散列容器:hash_map, hash_set, hash_multimap, hash_multiset 所有的标准库算法 相关头文件:

1.能量项链
(energy.pas/c/cpp) 【问题描述】 在 Mars 星球上,每个 Mars 人都随身佩带着一串能量项链。在项链上有 N 颗能量珠。能 量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗 珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘 是 Mars 人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可 以被吸盘吸收的能量。如果前一颗能量珠的头标记为 m,尾标记为 r,后一颗能量珠的头标 记为 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< span>时,第 i 颗珠子的尾标记应该等于第 i+1 颗珠子的头标 记。第 N 颗珠子的尾标记应该等于第 1 颗珠子的头标记。 至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一 颗珠子,然后按顺时针方向确定其他珠子的顺序。 【输出文件】 输出文件 energy.out 只有一行,是一个正整数 E(E≤2.1*109),为一个最优聚合 顺序所释放的总能量。 【输入样例】 4 2 3 5 10

【输出样例】 710

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

如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、1 个 或 2 个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的 N 元。于是,他把每件物品规定了一个重要度,分为 5 等:用整数 1~5 表示,第 5 等最重要。 他还从因特网上查到了每件物品的价格(都是 10 元的整数倍)。他希望在不超过 N 元(可 以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。

设第 j 件物品的价格为 v[j],重要度为 w[j],共选中了 k 件物品,编号依次为 j1,j
2,??,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 【输出样例】 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 1 2 3 1/3 1/2 2/2 工序 2 2/2 2/5 1/4

则对于安排顺序“1 1 2 3 3 2”,下图中的两个实施方案都是正确的。但所需要的总时间分 别是 10 与 12。

当一个操作插入到某台机器的某个空档时(机器上最后的尚未安排操作的部分也可以看作一 个空档),可以靠前插入,也可以靠后或居中插入。为了使问题简单一些,我们约定:在保 证约束条件(1)(2)的条件下,尽量靠前插入。并且,我们还约定,如果有多个空档可以 插入,就在保证约束条件(1)(2)的条件下,插入到最前面的一个空档。于是,在这些约 定下,上例中的方案一是正确的,而方案二是不正确的。 显然,在这些约定下,对于给定的安排顺序,符合该安排顺序的实施方案是唯一的,请 你计算出该方案完成全部任务所需的总时间。 【输入文件】 输入文件 jsp.in 的第 1 行为两个正整数,用一个空格隔开: m n (其中 m(<20)表示机器数,n(<20)表示工件数)

第 2 行:个用空格隔开的数,为给定的安排顺序。

接下来的 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< span>≤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 行,为两个正整数,用一个空格隔开:

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) 【问题描述】 某次科研调查时得到了 n 个自然数,每个数均不超过 1500000000(1.5*109) 。已知不相同的数不超过 10000 个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。 【输入】 输入文件 count.in 包含 n+1 行: 第 1 行是整数 n,表示自然数的个数。 第 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,每个数均不超过 1 500 000 000(1.5*109)

2.字符串的展开
(expand.pas/c/cpp) 【问题描述】 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字 符串中,含有类似于“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”应扩展为“dggffeeh” 。 (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 只有一行,为展开后的字符串。 【输入输出样例 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) 【问题描述】 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n*m 的矩阵,矩阵中的每个元素 aij 均为非负 整数。游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共 n 个。m 次后取完矩阵所有元素; 2. 每次取走的各个元素只能是该元素所在行的行首或行尾; 3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*2i,其中 i 表示第 i 次取数(从 1 开始编号) ; 4. 游戏结束总得分为 m 次取数得分之和。 帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。 【输入】 输入文件 game.in 包括 n+1 行: 第 1 行为两个用空格隔开的整数 n 和 m。 第 2~n+1 行为 n*m 矩阵,其中每行有 m 个用单个空格隔开的非负整数。 【输出】 输出文件 game.out 仅包含 1 行,为一个整数,即输入矩阵取数后的最大得分。 【输入输出样例 1】 game.in 2 3 1 2 3 3 4 2

game.out 82

【输入输出样例 1 解释】 第 1 次:第 1 行取行首元素,第 2 行取行尾元素,本次得分为 1*21+2*21=6 第 2 次:两行均取行首元素,本次得分为 2*22+3*22=20 第 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 122

game.out 316994

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

4. 树网的核

(core.pas/c/cpp) 【问题描述】 设 T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树) ,每条边带有正整数的权,我们称 T 为树网(treenetwork) ,其中 V, E 分别表示结点与边的集合,W 表示各边长度的集合,并设 T 有 n 个 结点。 路径:树网中任何两结点 a,b 都存在唯一的一条简单路径,用 d(a,b)表示以 a,b 为端点的路径的 长度,它是该路径上各边长度之和。我们称 d(a,b)为 a,b 两结点间的距离。 一点 v 到一条路径 P 的距离为该点与 P 上的最近的结点的距离: 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 是树网的中心, EF 边的长度为 5。如果指定 s=11,则树网的核为路径 DEFG(也可以取为路径 DEF) ,偏心距为 8。如果 指定 s=0(或 s=1、s=2) ,则树网的核为结点 F,偏心距为 12。

【输入】 输入文件 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 core.out 5

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

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

2008 年

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

一、题目概览
中文题目名称 英文题目名称 可执行文件名 输入文件名 输出文件名 每个测试点时限 笨小猴 word word word,in word.out 1秒 火柴棒等式 matches matches matches.in matches.out 1秒 传纸条 message message message.in message.out 1秒 双栈排序 twostack twostack twostack.in twostack.out 1秒

测试点数目 每个测试点分值 比较方式 题目类型

10 10 全文比较 传统

10 10 全文比较 传统

10 10 全文比较 传统

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. 笨小猴
(wird.pas/c/cpp)
【问题描述】 笨小猴的词汇量很小, 所以每次做英语选择题的时候都很头疼。 但是他找到了一种方法, 经试验证明, 用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设 maxn 是单词中出现次数最多的字母的出现次数,minn 是单词中出现 次数最少的字母的出现次数,如果 maxn-minn 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的 单词很可能就是正确的答案。 【输入】 输入文件 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 不是质数。

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。 matches.out 2

【输入输出样例 2】
matches.in 18 matches.out 9

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

3. 传纸条
(wassage.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 message.out 34

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

【输入输出样例 2】
twostack.in 4 2341 twostack.out 0

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

2009 年

潜伏者
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:通过内线掌握的信息,尝试破译密码。然后利用

破译的密码,翻译电报中的加密信息。 Input 共 3 行,每行为一个长度在 1 到 100 之间的字符串。 第 1 行为小 C 掌握的一条加密信息。 第 2 行为第 1 行的加密信息所对应的原信息。 第 3 行为 R 国司令部要求小 C 翻译的加密信息。 输入数据保证所有字符串仅由大写字母‘A’-‘Z’构成,且第 1 行长度与第 2 行相等。 Output 若破译密码停止时出现 2,3 两种情况,请你输出“Failed” (不含引号,注意首 字母大写,其它小写) 。 否则请输出利用密码翻译电报中加密信息后得到的原信息。 Sample Input MSRTZCJKPFLQYVAWBINXUEDGHOOILSMIJFRCOPPQCEUNYDUMPPYIZ SDWAHLNOVFUCERKJXQMGTBPPKOIYKANZWPLLVWMQJFGQYLLFLSO

Sample Output NOIP

Hankson 的趣味题
Hanks 博士是 BT (Bio-Tech, 生物技术) 领域的知名专家,他的儿子名叫 Hankson。现在, 刚刚放学回家的 Hankson 正在思考一个有趣的问题。 今天在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数和最小公倍数。 现在 Hankson 认为自己已经熟练地掌握了这些知识, 他开始思考一个“求公约数”和“求公 倍数”之类问题的“逆问题” ,这个问题是这样的:已知正整数 a0,a1,b0,b1,设某未知正 整数 x 满足: 1. x 和 a0 的最大公约数是 a1; 2. x 和 b0 的最小公倍数是 b1。 Hankson 的“逆问题”就是求出满足条件的正整数 x。但稍加思索之后,他发现这样 的 x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的 x 的个数。请 你帮助他编程求解这个问题。 Input 第一行为一个正整数 n, 表示有 n 组输入数据。 接下来的 n 行每行一组输入数据, 为四个正整数 a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证 a0 能被 a1 整除,b1 能被 b0 整除。 Output 共 n 行。每组输入数据的输出结果占一行,为一个整数。 对于每组数据:若不存在这样的 x,请输出 0; 若存在这样的 x,请输出满足条件的 x 的 个数; Sample Input 241 1 96 28895 1 37 1776 Sample Output 62 Hint 第一组输入数据,x 可以是 9、18、36、72、144、288,共有 6 个。 第二组输入数据,x 可以是 48、1776,共有 2 个。

对于 50%的数据,保证有 1≤a0,a1,b0,b1≤10000 且 n≤100。 对于 100%的数据,保证有 1≤a0,a1,b0,b1≤2,000,000,000 且 n≤2000。

最优贸易
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 条道路的信息(每条道路所连接的两个城市的编 号以及该条道路的通行情况) 。请你告诉阿龙,他最多能赚取多少旅费。 Input 第一行包 含 2 个正整数 n 和 m,中间用一个空格隔开,分别表示城市的数目和道路的数目。 第二行 n 个正整数,每两个整数之间用一个空格隔开,按标号顺序分别表示这 n 个城市的 商品价格。 接下来 m 行, 每行有 3 个正整数, x, y, z, 每两个整数之间用一个空格隔开。 如果 z=1, 表示这条道路是城市 x 到城市 y 之间的单向道路; 如果 z=2, 表示这条道路为城市 x 和 城市 y 之间的双向道路。 Output 共 1 行, 包含 1 个整数, 表示最多能赚取的旅费。 如 果没有进行贸易,则输出 0。 Sample Input 5 54 3 5 6 11 2 11 4 12 3 23 5 14 5 2 Sample Output 5 Hint 输入数据保证 1 号城市可以到达 n 号城市。 对于 10%的数据,1≤n≤6。 对于 30%的数据,1≤n≤100。 对于 50%的数据,不存在一条旅游路线,可以从一个城市出发,再回到这个城市。

对于 100%的数据,1≤n≤100000,1≤m≤500000,1≤x,y≤n,1≤z≤2,1≤各城市水晶球 价格≤100。

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

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

由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能 够得到的最高分数。 Input 一共 9 行。每行 9 个整数(每个数都在 0—9 的范围内) ,表示一个尚未填满的数 独方格,未填的空格用“0”表示。每两个数字之间用一个空格隔开。 Output 输出可以得到 的靶形数独的最高分数。如果这个数独无解,则输出整数-1。 Sample Input 7 0 0 9 0 0 0 0 11 0 0 0 0 5 9 0 00 0 0 2 0 0 0 8 00 0 5 0 2 0 0 0 30 0 0 0 0 0 6 4 84 1 3 0 0 0 0 0 00 0 7 0 0 2 0 9 02 0 1 0 6 0 8 0 40 8 0 5 0 4 0 1 2 Sample Output 2829 Hint40%的数据,数独中非 0 数的个数不少于 30。 80%的数据,数独中非 0 数的个数不少于 26。 100%的数据,数独中非 0 数的个数不少于 24。

2010 年
NOIP2010 提高组复赛试题及解题报告 1.机器翻译 (translate.pas/c/cpp)

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

4. 5. 6. 7.

1 2 5:查找单词 5 并调入内存。 2 5 4:查找单词 4 并调入内存替代单词 1。 2 5 4:在内存中找到单词 4。 5 4 1:查找单词 1 并调入内存替代单词 2。

共计查了 5 次词典。 【输入输出样例 2】 translate.in 2 10 8 824 11 78 11 78 11 78 8 264 【数据范围】 对于 10%的数据有 M=1,N≤5。 对于 100%的数据有 0 2.乌龟棋 (tortoise.pas/c/cpp) translate.out 6

【问题描述】 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行 N 个格子,每个格子上一个分数(非负整数)。棋盘第 1 格 是唯一 的起点,第 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 张爬行卡片上的数字。

【输出】 输出文件名 tortoise.out。 输出只有 1 行,1 个整数,表示小明最多能得到的分数。

【输入输出样例 1】 tortoise.in 9 5 6 10 14 2 8 8 18 5 17 1 3 1 2 1 tortoise.out 73

【输入输出样例 1 说明】 小明使用爬行卡片顺序为 1,1,3,1,2,得到的分数为 6+10+14+8+18+17=73。注意, 由于起点是 1,所以自动获得第 1 格的分数 6。 【输入输出样例 2】 tortoise.in 13 8 tortoise.out 455

4 96 10 64 55 13 94 53 5 24 89 8 30 1 1 1 1 1 2 4 1

【数据范围】 对于 30%的数据有 1≤N≤30,1≤M≤12。 对于 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。

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

【输出】 输出文件 prison.out 共 1 行,为 Z 市长看到的那个冲突事件的影响力。如果本年内监狱中 未发生任何冲突事件,请输出 0 【输入输出样例】 prison.in 4 6 1 4 2534 2 3 3512 1 2 28351 1 3 6618 2 4 1805 3 4 12884 prison.out

3512

【输入输出样例说明】 罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件影响 力是 3512(由 2 号和 3 号罪犯引发)。其他任何分法都不会比这个分法更优。

【数据范围】 对于 30%的数据有 N≤15。 对于 70%的数据有 N≤2000,M≤50000。 对于 100%的数据有 N≤20000,M≤100000。

4.引水入城 (flow.pas/c/cpp)

【问题描述】

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

1

【样例 1 说明】 只需要在海拔为 9 的那座城市中建造蓄水厂,即可满足要求。 【输入输出样例 2】

flow.in 3 6 8 4 5 6 4 4 7 3 4 3 3 3 3 2 2 1 1 2 【样例 2 说明】

flow.out

1 3

上图中,在 3 个粗线框出的城市中建造蓄水厂,可以满足要求。以这 3 个蓄水厂为 源头在干旱区中建造的输水站分别用 3 种颜色标出。当然,建造方法可能不唯一。

NOIP2010 解题报告 首先对这次比赛做一个总体分析。第一题我觉得没什么好说的,作为一道简单题还是挺简单 的。第二题是动态规划,朴素的做法可以得到 30-50 分,如果发现了方程中的一个小优化并 且稳稳当当地作对,可以拿到满分。第三题暴力搜索可以拿到 30 分。如果想得到满分,首先 要想到二分答案,可能多数同学没有想到这个方向上,再验证是否是二分图,通过 BFS 实现, 就可以拿到满分了。 第三题还有一个并查集的方法也可以做。第四题确实较难,首先通过 BFS 判断“无解”的情况,可以拿到 30 分,而对于有解的情况,需要仔细分析,得出一个“重要 结论”,之后用到 BFS 和 Dp 可以拿到满分。 下面我将逐题进行分析 第一题: (由于是 NOIP,这道题的题解我就给个时间复杂度高一点但是好理解的吧,大牛们忽略此题 题解) 我们用一个 a 数组维护当前内存存储的单词,并且从 1 到 m 的位置就是单词进入内存的先后 顺序。一开始内存是空的,所以所有位置上都是-1。 我们顺序操作文章中的 n 个单词,对于每个单词,我们都查找它当前是否在内存中。若它在 内存中,直接忽略过去;若它不在内存中,就需要把内存的 2~m 位置上的单词往前挪(挪到 1~m-1 处),并把新的这个单词放到 m 处,并把答案类加 1。最后输出答案即可。 第二题: 我们的任务是用给定的卡片从 1 走到 n,最终得分最大。动态规划的味道似乎挺浓的,于是 尝试一下。

动态规划首先要用变量来表示出状态。若要表示当前状态,需要用的变量是:当前位置、当 前还剩余哪些卡片。当前位置很好记录,一个变量 i 即可。而“当前还剩余哪些卡片”似乎 并不好记录。但仔细观察数据规模就会发现,卡片上的数值只会是 1、2、3、4,并且每种不 会超过 40 张,这样我们可以用 4 个变量 j1、j2、j3、j4 也可以记录了。而我们仔细观察就 会发现,这 5 个变量存在一个恒等式:i+j1+j2*2+j3*3+j4*4=n,也就是说其中一个可以通过 另外四个推出来。于是我们只需要 4 个变量(j1, j2, j3, j4)就可以表示出当前的状态了。 我们另 F[j1, j2, j3, j4]表示剩余 j1 张 1 卡片、剩余 j2 张 2 卡片、剩余 j3 张 3 卡片,剩 余 j4 张 4 卡片,走到 n 的最大得分。 而转移成子问题似乎也很显然: F[j1, j2, j3, j4] = a[n - j1+j2*2+j3*3+j4*4] + max(F[j1-1, j2, j3, j4] F[j1, j2-1, j3, j4] F[j1, j2, j3-1, j4] F[j1, j2, j3, j4-1]) 边界 F[0, 0, 0, 0]=a[n]。所求为 F[m1, m2, m3, m4]。 时间复杂度:O(p^4) 第三题: 这道题是一个明显的“最大值最小”问题。解释一下,就是让你找出一个分配方案,使得所 有冲突中的最大值尽量的小。“最大值最小”问题 99%都可以用二分答案来做。再具体解释 一下: 如果最后最小的最大冲突为 ans。对于一个在区间[0, ans)的数 k,一定不满足命题“所有 冲突值都小于等于 k”,而对于一个在区间[ans, 1000000000]的数 k,一定满足命题“所有 冲突值都小于等于 k”。这就好比是一个猜价格的游戏,你猜一个价格,我告诉你高了还是 低了,如果高了你就往低猜,如果低了你就往高猜。而这道题是你猜一个 k,根据它满足命 题还是不满足命题决定再大点还是再小点。当然,最快的方法就是在区间[0, 1000000000] 上二分这个 k。 那接下来我们的任务就变成了,验证一个 k,是否能满足命题“所有冲突都小于等于 k”。而 这个命题等价于“所有冲突值大于 k 的两个犯人必须被关押在不同的监狱”。那么通过 BFS 染色就可以判断。 时间复杂度:O(M*log(10^9)) 对于另一做法,需要一个更高级的知识——并查集。这里简单说说。 首先把所有冲突按照从大到小进行排序,然后进行操作。我们都检验,对于当前冲突的两个 人是否能把他俩分开。直到遇到两个人,他俩不可能被分开(如果分开了就跟前面冲突了), 那他俩的冲突度就是最后的答案了。而利用并查集可以维护已知的一些人的关系。 其中 p 为题目给定的每种卡片不超过 40

时间复杂度:O(MlogM)

第四题: 这道题个人认为出的不错。 首先判断是否有解。判断方法很简单:假设靠水库的所有城市((1, 1)~(1, m))都建造水泵, 判断是否能覆盖所有靠沙漠的城市。如果无解就顺便输出不能覆盖的个数。这些都能通过一 次 BFS 实现,时间复杂度 O(N*M)。 接下来考虑有解的情况。我就顺着我考场上的思路说吧。 我首先想到,能否通过一个预处理,求出:(1)对于单独在每个靠水库的城市(1, i)修建水 泵,求出它能覆盖到的靠沙漠的城市的**Ai。然后再考虑:(2)通过最少个数的 Ai,使得 它们的并集覆盖 1~n。 面对这两个问题,我同时进行思考,首先第一个问题 N^3 可以解决,N^2 似乎没有更好方法, 但也勉强接受,毕竟够 90 分了。面对第二个问题,尝试往网络流方向想,试图构建最小割模 型,可似乎没什么进展。 此时我仔细看了下第二个问题,发现它是 NP 问题!道理很简单,我们把每个靠水库的城市当 做一个 Boolean 型变量 Ri,建就是 TRUE,不建就是 FALSE。把每个靠沙漠的城市当做一个表 达式,如果这个城市出现在某几个水库的**中,例如 Ai、Aj、Ak、Ap、Aq 中,那么这个表达 式就是“Ri Or Rj Or Rk Or Rp Or Rq”,我们的目的是满足所有表达式。显然这是一个多 sat 问题,而多 sat 问题是 NP 问题。(这段完全是思路,看不懂的就忽略过去) 从而我们得出一个结论:这个图、这个问题肯定有它的特殊性! 究竟是什么特殊性呢?经过我的观察,我大胆预测一个结论:如果某个靠水库的城市构建水 泵,它能覆盖的 Ai 一定是连续的一段!(如果不是连续一段必然无解)道理很简单: |<--------O--->| | | | |

------>X<------例如,出现这样一个靠水库的城市“O”,它覆盖的不是连续一段区间,即中间有一个或多个 “X”。由于“O”到“X”的两条路海拔高度都是严格递降的(如箭头方向)。也就是说,在 这个“环”上无法找到一个点到“X”的路径为单调递降的。那“X”位置就不可能被任意一 个靠水库的城市覆盖。 所以我们得出重要结论:在每一个靠水库的城市修建水泵,能覆盖的区间一定是连续的一段!

那接下来问题有两个:(1)对于每个靠水库的城市 i,求出它能覆盖的靠沙漠的城市 ST[i] 和 ED[i]。(2)已知 m 条线段,每条线段是从 ST[i]到 ED[i],求最少的线段能覆盖 1-n。 先说第二个问题,是一个经典的 Dp。(不怕大牛笑话我们就说个暴力点但是易懂的方法吧) 我们定义 F[i]表示覆盖 1~i 需要的最小线段数量。 F[i] = min(F[ST[j]-1])+1 边界 F[0] = 0,所求为 F[m]。 时间复杂度 O(M^2) 而对于第一个问题,O(N*M*M)的方法很简单,分别从(n, 1)~(n, m)搜索 m 次即可。我们重点 说说 O(N*M)的方法。由于 ST 和 ED 是对称问题,我们只说 ST 如何求。我们先从(n, 1)开始 往上面 BFS(只不过改成从低向高搜索),能够搜到的点就是“能够从这个点传递到(n, 1) 的点”。显然这些点能够到达的底层最左端的点就是 1。然后我们再从(n, 2)往上 BFS,只不 过对于(n, 1)之前搜到过的点就不必再重新搜索了(因为这次搜到的点结果是 2,肯定比之 前的 1 大,而我们求的是最小值)。接下来我们再从(n, 3)、(n, 4)??往后搜索,同理遇 到之前搜过的点就不必再重新搜索了。由于每个点只被搜到一次,所以复杂度是 O(N*M)。而 对于 ED,只需要从(n, m)倒叙至(n, 1)的顺序搜索即可。 最终这道题可以在 O(M*(M+N))的时间复杂度解决。 1<=j<=m 且必须满足 ST[j] <= i <= ED[j]


相关文章:
NOIP(1995-2010)提高组复赛试题
NOIP(1995-2010)提高组复赛试题_学科竞赛_高中教育_教育专区 暂无评价|0人阅读|0次下载|举报文档 NOIP(1995-2010)提高组复赛试题_学科竞赛_高中教育_教育专区。...
NOIP2010年提高组复赛试题
NOIP2010提高组复赛试题_初一数学_数学_初中教育_教育专区。noip题目...【输入输出样例 1】 95 6 10 14 2 8 8 18 5 17 13121 【输入输出样例 ...
NOIP1995提高组复赛试题
NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛 同创杯”全国青少年信息学(计算机)奥林匹克竞赛 分区联赛复赛试题(高中组) 分区联赛复赛试题(高中组) ...
NOIP1995提高组(复赛)
NOIP1995提高组(复赛)_IT认证_资格考试/认证_教育专区。NOI’95 “同创杯”全国...NOI’95 “同创杯”全国青少年信息学(计算机)奥林匹克竞赛 分区联赛复赛试题(...
历届noip提高组复赛试题
历届noip提高组复赛试题_学科竞赛_高中教育_教育专区 暂无评价|0人阅读|0次下载|举报文档历届noip提高组复赛试题_学科竞赛_高中教育_教育专区。NOI’95 “同创杯”...
NOIP1995年普及组复赛试题
NOIP1995提高组复赛试题 2页 免费 2009年NOIP复赛普及组试... 7页 1下载券 NOIP2010普及组复赛试题... 7页 免费 2004NOIP复赛试题普及组 6页 1下载券 ...
NOIP历年复赛提高组试题(2004-2013)
NOIP历年复赛提高组试题(2004-2013)_学科竞赛_高中教育...95 18 29 30 53 88 83 64 67 【限制】 60%...(NOIP2010)复赛试题(提高组 1、机器翻译(translate....
NOIP历年复赛提高组试题(2006-2014)
NOIP 复赛试题(提高组) Son.in 2 41 95 1 96 288 1 37 1776 Son.out...(NOIP2010)复赛试题(提高组 1、机器翻译(translate.pas/c/cpp) 【问题描述】...
NOIP2014提高组复赛试题
CCF 全国信息学奥林匹克联赛(NOIP2014)复赛 提高组 day1 1.生活大爆炸版石头剪刀布 (rps.cpp/c/pas) 【问题描述】 石头剪刀布是常见的猜拳游戏:石头胜剪刀,...
更多相关标签:
noip提高组复赛试题 | noip2016提高组复赛 | noip2015提高组复赛 | noip2014提高组复赛 | noip2010提高组复赛 | noip2016复赛试题 | noip2012提高组复赛 | noip2013提高组复赛 |