NOI 2013 全国青少年信息学奥林匹克竞赛
重庆代表队选拔赛
试题一览
题目 | 新Nim游戏 | 棋盘游戏 | 二进制a+b | 图的逆变换 | 新数独 |
代号 | nim | chess | aplusb | inverse | sudoku |
输入文件 | nim.in | chess.in | aplusb.in | inverse.in | sudoku.in |
输出文件 | nim.out | chess.out | aplusb.out | inverse.out | sudoku.out |
测试点数目 | 10 | 25 | 25 | 20 | 8 |
单测试点分值 | 20 | 8 | 8 | 10 | 25 |
满分分值 | 200 | 200 | 200 | 200 | 200 |
时限 | 1秒 | 2秒 | 2秒 | 2秒 | 1秒 |
2013年3月?日
5小时完成
注意:可以使用64位整数和STL,但这不一定是解题必须的
新Nim游戏
传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。
本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游戏者也有这样一次机会。从第三个回合(又轮到第一个游戏者)开始,规则和Nim游戏一样。
如果你先拿,怎样才能保证获胜?如果可以获胜的话,还要让第一回合拿的火柴总数尽量小。
【输入格式】
第一行为整数k。即火柴堆数。第二行包含k个不超过109的正整数,即各堆的火柴个数。
【输出格式】
输出第一回合拿的火柴数目的最小值。如果不能保证取胜,输出-1。
【输入输出样例】
nim.in | nim.out |
6 5 5 6 6 5 5 | 21 |
nim.in | nim.out |
3 1 2 3 | 1 |
【数据范围】
编号 | 1-5 | 6-10 |
k | <=10 | <=100 |
棋盘游戏
一个n*n(n>=2)棋盘上有黑白棋子各一枚。游戏者A和B轮流移动棋子,A先走。
l A的移动规则:只能移动白棋子。可以往上下左右四个方向之一移动一格。
l B的移动规则:只能移动黑棋子。可以往上下左右四个方向之一移动一格或者两格。
和通常的“吃子”规则一样,当某游戏者把自己的棋子移动到对方棋子所在的格子时,他就赢了。两个游戏者都很聪明,当可以获胜时会尽快获胜,只能输掉的时候会尽量拖延时间。你的任务是判断谁会赢,需要多少回合。
比如n=2,白棋子在(1,1),黑棋子在(2,2),那么虽然A有两种走法,第二个回合B总能取胜。
【输入格式】
输入仅一行,包含五个整数n, r1, c1, r2, c2,即棋盘大小和棋子位置。白色棋子在(r1,c1),黑色棋子在(r2,c2)(1<=r1,c1,r2,c2<=n)。黑白棋子的位置保证不相同。
【输出格式】
输出仅一行,即游戏结果。如果A获胜,输出WHITE x;如果B获胜,输出BLACK x;如果二者都没有必胜策略,输出DRAW。
【输入输出样例】
chess.in | chess.out |
2 1 1 2 2 | BLACK 2 |
chess.in | chess.out |
2 2 2 1 2 | WHITE 1 |
chess.in | chess.out |
3 1 1 3 3 | BLACK 6 |
【数据范围】
编号 | 1-10 | 11-25 |
n | <=5 | <=20 |
二进制a+b
输入三个整数a, b, c,把它们写成无前导0的二进制整数。比如a=7, b=6, c=9,写成二进制为a=111, b=110, c=1001。接下来以位数最多的为基准,其他整数在前面添加前导0,使得a, b, c拥有相同的位数。比如在刚才的例子中,添加完前导0后为a=0111, b=0110, c=1001。最后,把a, b, c的各位进行重排,得到a’, b’, c’,使得a’+b’=c’。比如在刚才的例子中,可以这样重排:a’=0111, b’=0011, c’=1010。
你的任务是让c’最小。如果无解,输出-1。
【输入格式】
输入仅一行,包含三个整数a, b, c。
【输出格式】
输出仅一行,为c’的最小值。
【输入输出样例】
aplusb.in | aplusb.out |
7 6 9 | 10 |
aplusb.in | aplusb.out |
1 1 4 | 2 |
aplusb.in | aplusb.out |
1 1 1 | -1 |
【数据范围】
编号 | 1-5 | 6-10 | 11-25 |
a,b,c | <=100 | <=1000 | <=230 |
图的逆变换
给一个n结点m条边的有向图D,可以这样构造图E:给D的每条边u->v,在E中建立一个点uv,然后对于D中的两条边u->v和v->w,在E中从uv向vw连一条有向边。E中不含有其他点和边。
输入E,你的任务是判断是否存在相应的D。注意,D可以有重边和自环。
【输入格式】
第一行包含测试数据个数T(T<=10)。每组数据前两行为D的边数(即E的点数)m和E的边数k(0<=m<=300)。以下k行每行两个整数x, y,表示E中有一条有向边x->y。E中的点编号为0~m-1。
【输出格式】
对于每组数据输出一行。如果存在,输出Yes,否则输出No。
【输入输出样例】
inverse.in | inverse.out |
4 2 1 0 1 5 0 4 3 0 1 2 1 2 3 3 9 0 1 0 2 1 2 1 0 2 0 2 1 0 0 1 1 2 2 | Yes Yes No Yes |
新数独
下面是一个没有数字,只有大小关系(没错!那些尖角都是“大于”符号!)的数独:
除了大小关系外(注意相邻格子不能相同),还需要满足通常的数独规则:
l 每个格子都是1~9 的数字
l 每行都是1~9的排列
l 每列都是1~9的排列
l 每个3*3的子矩阵(上图中用粗线隔开,一共有3*3个这样的子矩阵)都是1~9的排列
为了美观,每个3*3子矩阵的所有12对相邻格子的大小关系都将给出。
【输入格式】
输入一共15行,包含一个新数独的实例。第奇数行包含左右方向的符号(<和>),第偶数行包含上下方向的符号(^和v)。
【输出格式】
输出包含9行,每行9个1~9的数字,以单个空格隔开。输入保证解惟一。
【输入输出样例】
sudoku.in | sudoku.out |
5 3 9 4 6 8 2 1 7 2 4 8 1 9 7 3 5 6 1 6 7 2 3 5 9 8 4 6 8 1 7 4 2 5 9 3 3 7 5 9 1 6 8 4 2 9 2 4 5 8 3 7 6 1 7 9 6 8 2 1 4 3 5 4 1 2 3 5 9 6 7 8 8 5 3 6 7 4 1 2 9 |
【提示】
强烈建议选手使用电子版的样例输入输出进行测试。