[HNOI][2010][Day2]

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

2010-7-4

NOI2010湖南省组队选拔赛第二试试题

第一题:取石子游戏(程序文件名:stone.exe)100 分,运行时限:
2s

A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提
供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参加比赛。
与经典的取石子游戏相比,A 公司举办的这次比赛的取石子游戏规则复杂了很多:
 总共有 N 堆石子依次排成一行,第 i 堆石子有 ai 个石子。
 开始若干堆石子已被 A 公司故意拿走。
 然后两个玩家轮流来取石子,每次每个玩家可以取走一堆中的所有石子,但有一个限
制条件:一个玩家若要取走一堆石子,则与这堆石子相邻的某堆石子已被取走(之前被
某个玩家取走或开始被 A 公司故意拿走)。注意:第 1 堆石子只与第 2 堆石子相邻,第
N 堆石子只与第 N-1 堆石子相邻,其余的第 i 堆石子与第 i-1 堆和第 i+1 堆石子相邻。
 所有石子都被取走时,游戏结束。谁最后取得的总石子数最多,谁就获得了这场游戏
的胜利。
作为这次比赛的参赛者之一,绝顶聪明的你,想知道对于任何一场比赛,如果先手者和后
手者都使用最优的策略,最后先手者和后手者分别能够取得的总石子数分别是多少。
【输入格式】(input.txt)
从文件input.txt中读入数据,输入文件第一行是一个正整数N,表示有多少堆石子。输入
文件第二行是用空格隔开的N个非负整数a1, a2, …, aN,其中ai表示第i堆石子有多少个石子,
ai = 0表示第i堆石子开始被A公司故意拿走。输入的数据保证0≤ai≤100,000,000,并且至少有
一个i使得ai = 0。30%的数据满足2≤N≤100,100%的数据满足2≤N≤1,000,000。
【输出格式】(output.txt)
输出文件 output.txt 仅包含一行,为两个整数,分别表示都使用最优策略时,最后先手者
和后手者各自能够取得的总石子数,并且两个整数间用一个空格隔开。
【输入输出样例1】
input.txt output.txt
8 17 9
1 2 0 3 7 4 0 9
样例解释:两个玩家都使用最优策略时取走石子的顺序依次为9, 2, 1, 4, 7, 3,因此先手
者取得9 + 1 + 7 = 17个石子,后手者取得2 + 4 + 3 = 9个石子。
【输入输出样例2】
input.txt output.txt
3 5 0
5 0 0

第二题:城市建设(程序文件名:city.exe)100 分,运行时限:2s

PS 国是一个拥有诸多城市的大国,国王 Louis 为城市间的道路修建可谓绞尽脑汁。Louis


可以在某些城市之间修建道路,并且在不同城市之间修建道路需要不同的花费。Louis 希望修

第 1 页共 3 页
2010-7-4

建最少的道路使得国内所有的城市连通。但是由于某些因素,城市之间修建道路需要的花费会
随时改变,Louis 会不断收到道路修建花费被改变的消息,他希望每收到一条消息后能立即知
道使城市连通的最小总花费,Louis 决定求助于你来完成这个任务。
【输入格式】(input.txt)
从文件input.txt中读入数据,输入文件第一行是用空格隔开的三个整数N,M,Q,分别表示
城市的数目,可以修建的道路的条数,以及收到的消息的个数。接下来有M行,第i+1行是用空
格隔开的三个整数Xi,Yi,Zi(1≤Xi,Yi≤N,0≤Zi≤50000000),表示在城市Xi与城市Yi之间修建
道路的花费为Zi。紧接着的Q行,每行是用空格隔开的两个整数Kj和Dj,表示前面输入的第Kj
条道路的修建花费被修改为Dj。输入的数据保证20%的数据满足N≤1000,M≤6000,Q≤6000。20%
的数据满足N≤1000,M≤50000,Q≤8000且修改后的花费不会比之前的花费低。100%的数据满足N
≤20000,M≤50000,Q≤50000。
【输出格式】(output.txt)
输出文件 output.txt 包含 Q 行,第 i 行输出收到前 i 条消息后使城市连通的最小总花费。
【输入输出样例】
input.txt output.txt
5 5 3 14
1 2 1 10
2 3 2 9
3 4 3
4 5 4
5 1 5
1 6
1 1
5 3

第三题:弹飞绵羊(程序文件名:bounce.exe)100 分,运行时限:1s

Lostmonkey 发明了一种超级反弹装置。为了在绵羊朋友面前显摆,他邀请小绵羊一起玩个
游戏。游戏一开始,Lostmonkey 在地上沿一条直线摆放 n 个反弹装置,并按从前往后的方式将
反弹装置依次编号为 0 到 n-1,对 0≤i≤n-1,为第 i 个反弹装置设定了初始弹力系数 ki,当
绵羊落到第 i 个反弹装置上时,它将被往后弹出 ki 步,即落到第 i+ki 个反弹装置上,若不存
在第 i+ki 个反弹装置,则绵羊被弹飞。绵羊想知道:从第 i 个反弹装置开始,它被弹出几次(含
被弹飞的那次)后会被弹飞。为使游戏更有趣,Lostmonkey 还可以修改某个反弹装置的弹力系
数,但任何时候弹力系数均为正整数。
【输入格式】(input.txt)
从文件input.txt中读入数据,输入文件第一行是一个整数n,表示地上摆放n个反弹装置,
输入文件第二行是用空格隔开的n个正整数k0,k1,…,kn-1,分别表示n个反弹装置的初始弹力系
数。输入文件第三行是一个正整数m,表示后面还有m行输入数据。接下来的m行,每行至少有用
空格隔开的两个整数i和j,若i=1,则你要输出从第j个反弹装置开始,被弹出几次后会被弹飞;
若i=2,则该行有用空格隔开的三个整数i,j和k,表示第j个反弹装置的弹力系数被修改为k。
输入的数据保证20%的数据满足n,m≤10000。100%的数据满足n≤200000,m≤100000
【输出格式】(output.txt)
输出文件output.txt包含的行数等于输入文件最后m行中i=1的行数。第h行输出一个整数,
表示对输入中给出的第h个求弹出次数的问题,基于n个反弹装置当时的弹力系数,求出的弹出
次数。
【输入输出样例】

第 2 页共 3 页
2010-7-4

input.txt output.txt
4 2
1 2 1 1 3
3
1 1
2 1 1
1 1

第四题:矩阵(程序文件名:matrix.exe)100 分,运行时限:1s

小 Z 近日热衷于研究矩阵。他首先写下一个 N*M 的矩阵,在每个格子里填入一个小于 P 的


非负整数,然后对其中的每个 2*2 的子矩阵,算出其中各数之和。例如 N=3,M=3,P=3,小 Z
写下的矩阵如下:

其中共有 4 个 2*2 的子矩阵,容易算出其中各数之和,表示如下:

第一行和第一列的 0 是为了格式美观而添加进去的。现在小 Z 想试一试能不能根据这些和


推算出原矩阵。因为小 Z 的数学没学好,所以这个任务就交给你了。当然,小 Z 早就发现:解
很可能不唯一,例如对下面的矩阵 B 算出的其中各数之和与矩阵 A 相同。

因此在有多个矩阵满足要求的情况下请你输出按字典序最小的那一个矩阵。
字典序的定义如下:对两个矩阵 X 和 Y,找到 X 和 Y 中的数不同的位置中行数最小的那个
格子,若有多个这样的格子则取列数最小的那个格子,该格子中的数较小的矩阵字典序也较小。
例如上述矩阵 A 和 B,第一个不同的格子是第一行第二列的那个格子,而 A[1][2]<B[1][2],
故矩阵 A 的字典序比矩阵 B 小。
另外,小 Z 的数学尚未差到连加法都做错的地步,因此保证输入数据都是有解的。
【输入格式】(input.txt)
从文件input.txt中读入数据,输入文件第一行是用空格隔开的三个正整数N,M,P,分别
表示矩阵的行数、列数以及输出矩阵元素的上界(即要求输出矩阵元素小于P) 。接下来有N行,
每行是用空格隔开的M个非负整数,其中第i+1行第j个数表示以格子(i,j)为右下角的2*2子矩阵
中各数之和。输入的数据保证第2行及除第1行外的各行的第1个数均为0,且第2行后各行中的数
均不超过4(P-1)。输入的数据保证30%的数据满足N,M≤10。另外30%的数据满足P=2。100%的数
据满足1<N,M≤200,1<P≤10。
【输出格式】(output.txt)
输出文件 output.txt 包含 N 行,每行是用空格隔开的 M 个整数(行末不允许多余的空格) ,
第 i 行输出中的数就是你求出的矩阵的第 i 行中的数。
【输入输出样例】
input.txt output.txt
3 3 3 0 0 2
0 0 0 2 2 1
0 4 5 1 0 0
0 5 3

第 3 页共 3 页

You might also like