2019暑期集训 - Day 1
第一天集训,比赛题目不难也不简单,考得很不错,但还是挺累的
概述
提高 B 组
3题:T0 , T1 , T2
290.9/300 分
1/128 名
T0 游戏
WA 90.9/100 分
Description
Alice 和 Bob 在玩一个游戏,游戏是在一个 \(N\times N\) 的矩阵上进行的,每个格子上都有一个正整数。当轮到 Alice / Bob 时,他/她可以选择最后一列或最后一行,并将其删除,但必须保证选择的这一行或这一列所有数的和为偶数。如果他/她不能删除最后一行或最后一列,那么他/她就输了。两人都用最优策略来玩游戏,Alice 先手,问 Alice 是否可以必胜?
Input
第一行: \(T\) ,表示数据组数
对于每组数据的第一行: \(N\)
接下来 \(N\) 行,每行 \(N\) 个数,描述这个矩阵
Output
如果 Alice 必胜输出 W ,否则输出 L
Sample Input
2
2
2 4
6 8
3
5 4 2
1 5 9
7 3 8
Sample Output
L
W
Hint
30% 数据满足
\(1 \leq N \leq 5\)
50% 数据满足
\(1 \leq N \leq 100\)
70% 数据满足
\(1 \leq N \leq 500\)
100% 数据满足
\(1 \leq N \leq 1000\)
保证每一行或每一列的和不会超过\(2\times10^9\)
\(1 \leq T \leq 5\)
Solution
这题可以用动态规划解决:
设 add[i][j][0] 代表棋盘的 \(i\) 行从第一个数到第 \(j\) 个数的和的奇偶性; add[i][j][1] 代表棋盘的 \(j\) 列从第一个数到第 \(i\) 个数的和的奇偶性
令 winner[i][j] 表示从棋盘的 \(i\) 行 \(j\) 列开始,先手必胜或必负, \(1\) 为胜、 \(2\) 为负
那么我们就可以把状态转移至 !winner[i-1][j] 和 !winner[i][j-1] 中
具体说
当 add[i][j][0]==1 && add[i][j][1]==1
先手必败(两个方向都是奇数,无法取)
当 add[i][j][0]==0 && add[i][j][1]==1
则 winner[i][j] = !winner[i-1][j](只有行是偶数,所以只能取这一行,那么现在对手的必败就是本方的必胜)
当 add[i][j][0]==1 && add[i][j][1]==0
则 winner[i][j] = !winner[i][j-1](只有列是偶数,所以只能取这一列)
当 add[i][j][0]==1 && add[i][j][1]==1
则 winner[i][j] = !winner[i][j-1] || !winner[i-1][j](行、列都是偶数,所以都能取,那么只有两种取法都必败此时才会必败)
T1 六边形
AC 100/100 分
Description
棋盘是由许多个六边形构成的,共有 \(5\) 种不同的六边形编号为 \(1\) 到 \(5\) ,棋盘的生成规
则如下:
- 从中心的一个六边形开始,逆时针向外生成一个个六边形。
- 对于刚生成的一个六边形,我们要确定它的种类,它的种类必须满足与已生成的相邻的六边形不同。
- 如果有多个种类可以选,我们选择出现次数最少的种类。
- 情况 \(3\) 下还有多个种类可以选,我们选择数字编号最小的。
现在要你求第 \(N\) 个生成的六边形的编号
前 \(14\) 个六边形生成图如下:

Input
第一行: \(T\) ,表示数据组数
接下来 \(T\) 行,每行一个数: \(N\) ,表示第 \(N\) 个六边形
Output
共 \(T\) 行,每行一个数,表示第 \(N\) 个数据的答案
Sample Input
4
1
4
10
100
Sample Output
1
4
5
5
Hint
30% 数据满足
\(1 \leq N \leq 100\)
100% 数据满足
\(1 \leq T \leq 20\)
\(1 \leq N \leq 10000\)
Solution
方法1
这题呢,我用的是递推:
我把与 \(2\) 个点相邻的点称之为角,与 \(3\) 个点相邻的点称之为边,边和角统称为点(当然,没算第最里面两圈)
画一个图,

图中数字代表编号 \(k\)
我们可以看出,第 \(i\) 圈上
角\(k\) 与 边\(k-1\) 和 角 \(k-6i-t\) 相邻,其中 \(t=0,1,2,3,4,5\) (图中表明了 \(t\) 的取值)
比如 \(22\) 与 \(21,22-6\times 2-1=9\) 相邻,\(25\) 与 \(24,25-6\times 2-2=11\) 相邻
并且,\(1,5,19,37\) 这一列与 3 个点相邻,所以它们不是角;\(2,8,10\) 这一列才是角
同样, 边 \(k-1\) 也与上述 点\(k-1\) 和 点\(k-6i-t\) 相邻,但同时也与 点\(k-6i-t-1\) 相邻( \(t\) 的取值也在图中表明了)
比如 \(36\) 与 \(35,36-6\times 2-5=19\) 相邻,也与 \(36-6\times 2-5-1=18\) 相邻
那么现在我们知道了每个点的相邻处,剩下的就只需要从头递推模拟下去了。
方法2
这是网上给的一种方法:
把图简化成这样

这样我们就把这个东西转化成一个二维数组存储,将所有值初始化为 \(0\) ,则
\(a[i][j]\ne a[i-1][j],a[i][j-1],a[i+1][j],a[i][j+1],a[i-1][j-1],a[i+1][j+1]\)
那么只要找好下一个点的坐标,就很好递推了
T2 数列
AC 100/100 分
Description
给你一个长度为 \(N\) 的正整数序列,如果一个连续的子序列,子序列的和能够被 \(K\) 整除,那么就视此子序列合法,求原序列包括多少个合法的连续子序列?
对于一个长度为 \(8\) 的序列,\(K=4\) 的情况:\(2, 1, 2, 1, 1, 2, 1, 2\)
它的答案为 \(6\) ,子序列是
位置1->位置8,2->4,2->7,3->5,4->6,5->7
Input
第一行: \(T\) ,表示数据组数
对于每组数据:
第一行: \(2\) 个数,\(K,N\)
第二行:\(N\) 个数,表示这个序列
Output
共 \(T\) 行,每行一个数表示答案
Sample Input
2
7 3
1 2 3
4 8
2 1 2 1 1 2 1 2
Sample Output
0
6
Hint
30% 数据满足
\(1\leq T\leq 10\)
\(1\leq N,K\leq 1000\)
100% 数据满足
\(1\leq T\leq 20\)
\(1\leq N\leq 50000\)
\(1\leq K\leq 1000000\)
序列的每个数\(\leq 1000000000\)
Solution
方法1
这题呢,比前两题都简单,主要用前缀和做:
令 add[i]=(a[1]+a[2]+a[3]+ ... +a[i])%k
cnt[t] 代表 add 中值为 t 的数的个数
显然,当 add[i] == add[j] 时,从第 i+1 个数到第 j 个数的和能被k整除(因为两个前缀和同余)
也就是说因为有 cnt[t] 个前缀和 mod k 同余,所以这些值共能组成 cnt[t]*(cnt[t]-1)/2 个数对 (i,j) ,它们之间的序列的和都是k的整数倍
所以我们得到
\(\large{ans=cnt[0]+\sum_{i=0}^{k-1} {\frac{cnt[i]\times (cnt[i]-1)}{2} }}\)
注意,mod k = 0 的前缀和本来就是k的倍数,所以答案要加上cnt[0]
方法2
这是同学的方法,也挺好的:
就按样例来说
k=4
2 1 2 1 1 2 1 2
把这个数列2分为 2 1 2 1 和 1 2 1 2
递归求两部分内部分别的合法连续子序列数
然后把它们加起来,再加上跨越两边的合法连续子序列数
跨越两边的合法连续子序列数可以这样算
求出左序列从右往左的前缀和 mod k(值为 2 0 3 1),和右序列从左往右的前缀和 mod k(值为 1,3,0,2)
然后,在左右两边前缀和的和为k时(如左序列的1和右序列的3),两边并在一起可以形成新的合法连续子序列
可以同样使用排列组合的思想快速计算出个数
记忆化搜索
记忆化搜索是个好东西
一般来说,动态规划的题目都能用记忆化搜索完成。
并且,比起递归和动态规划,记忆化搜索会更快一些,在空间上也有办法优化动态规划大大的 \(N\) 维数组(比如说可以用 map 减小空间占用)
记忆化搜索其实基本就是在递归时记录每个小问题的结果,从而避免多次重复计算同样的子问题,提高了递归的效率;记忆化搜索每次解决的子问题都对于解决大问题是必要的,也省去了动态规划中计算的无用信息。
今天的T0就可以用记忆化搜索完成,效率也不低。
但是,记忆化搜索有个很大的问题,它很容易让人忘记一些必要的初值和特判值,使部分测试点WA掉;与此相比,动态规划是顺推,在开始时一般就很容易写好初值和特判,今天的T0我就是因为初始化的问题 WA 90.9的。并且,当子问题不会重复时,记忆化搜索就和递归没什么两样了,这时记忆化的存储反倒成了累赘,所以一定要弄清子问题是否会重复再决定使用哪种方法。

浙公网安备 33010602011771号