CSDN 编程竞赛十四期题解

竞赛总览

CSDN编程竞赛十四期:比赛详情 (csdn.net)

本次竞赛题目难度适中,并且题目的解法(思路)也比较多,很适合新人学习。

竞赛题解

题目1、字符串全排列

对K个不同字符的全排列组成的数组,面试官从中随机拿走了一个,剩下的数组作为输入,请帮忙找出这个被拿走的字符串?比如[“ABC”, “ACB”, “BAC”, “CAB”, “CBA”],返回“BCA”。

注意到全排列一定是偶数,因此如果某个字符出现奇数个,说明它就是缺少的那一个。

然后的处理过程就比较随意了,怎么写都可以。这里推荐用异或的写法,因为异或有一个特性:操作一次可以得到结果,操作两次相互抵消(相当于还原)。

如果是不缺少的字符,对应位置一定会异或偶数次。

注意一下只有两个字符的情况,这时异或会卡出bug,无法得到正确答案。此时单独处理即可。 

题目2、小Q新式棋盘

已知棋盘大小为n*n。每个位置都有自己的权值q。该棋盘中有多少对行权值和小于列权值和。

经典的前缀和问题,可以一维前缀和,也可以直接二维前缀和。

代码就不放了,感兴趣可以去网上找一些前缀和算法的教程,这个资料是非常多的。

题目3、因数-数字游戏

小Q的柠檬汁做完了。掏出了自己的数字卡牌。想要和别人做数字游戏。可是她又不想要输掉游戏。她制定好规则,每次每个人只能把这个牌换成它的因子的某个牌。但是这个因子不能是1或者整数本身。现在给出整数n。两个人开始做游戏,谁无法再给出因子牌则该人胜利,如果该整数无因子牌直接视为先手胜利,请判断先手在最优策略状态下能否必胜。

经典的博弈论问题。解决这种双人游戏求解最优策略的问题,和解递归题的思路有点像。

只考虑轮到自己的情况即可。如果可以把局面推给对手(轮到对手时),要假设自己就是对手,考虑最优方案。也就是说每次都认为是轮到自己,然后找到最优的策略。否则绕一会就晕了。

首先,要找到直接能获胜的状态。这道题目描述的是,如果整数无因子,视为先手胜利。

所以,如果某个数不是质数,那么它有一个因子时,只能选择这个因子,此时后手胜利。

如果有多个因子,想办法把它变成只有一个因子的数,留给对手,然后对手只能被迫选择该因子,此时先手胜利。

这时候这题就解决了。

还有一些经典的博弈题目,比如取石子问题(有很多变种)。

这里推荐一个经典题目,两人进行游戏,从一堆石子取1到3个,取走最后1个石子的玩家胜利。

手游“我的侠客”的迷宫里就有人机和你玩这个游戏,如果和电脑玩的次数多了,你会发现无论你怎么取,对方总是保持和你相反的方法(玩家取1,电脑取3;玩家取2,电脑取2;玩家取3,电脑取1)。

还是从直接获胜的状态考虑,只有1到3个石子时候获胜。

否则,就要让石子数量能剩下一个,也就是说4个石子为一轮,这样对手最多取3个,自己就取走1个。如果对手取1个,自己就取走最后3个。

所以最优策略一定是留下4N的棋子给对手。

其它博弈题做法也都类似,找到能直接获胜状态,再想办法让其它状态能变为直接获胜状态即可。

题目4、编码

编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有26个字母{a, b, …, z},这些特殊的单词长度不超过6且字母按升序排列。把所有这样的长度相同的单词放在一起,按字典顺序排列(a...z, ab...az, bc...bz....)一个单词的编码就对应着它在整个序列中的位置。你的任务就是对于所给的单词,求出它的编码。

洛谷原题。

使用动态规划,计算出每个长度下,不同字母开头,符合条件的字符串数量。

然后将题目问的那个字符串之前的字符串数量都加起来,就可以得到答案了。

你可能感兴趣的:(CSDN,竞赛题解,算法,c++)