本期四道题还是全考过,题解在网上也都搜得到。。。只好继续水一份不算题解的题解。
第一题:交换后的or
给定两组长度为n的二进制串,请问有多少种方法在第一个串中交换两个不同位置上的数字,使得这两个二进制串“或”的结果发生改变?
输入描述:一个整数n (2≤n≤10^5)。接下来两行两个长度是n的01字符串,分别是题目描述的第一个串与第二个串。
输出描述:一行一个数字,方案数量。
示例:
示例 输入 5
01011
11001输出 4
分析
很久以前考过(少说也有半年了吧?),那时问哥还对系统的算法理论没有多少概念,只是简单地把所有题目都当做脑力训练,做完也不会去总结。这道题现在看来很简单,但当时做出来还是挺有成就感的。
题目要求二进制“或”的结果发生改变,显然要实现这个要求,只有两种可能:
- “或”的结果从0变成1 --> 0, 0 变成 1, 0 或 0, 1 或 1, 0
- “或”的结果从1变成0 --> 1, 0 或 0, 1 或 1, 1 变成 0, 0
但是题目要求只改变第一个串,所以只要考虑第一个串的变化,也就只有两种可能:
- 从 0, 0 变成 1, 0 --> 将第一个串的 0 换成其他位置的 1
- 从 1, 1 变成 0, 1 --> 将第一个串的 1 换成其他位置的 0
但是这里有个坑,就是这两种可能重复计算了 0 和 1 交换后结果相同的情况。比如例子中 01011 和 11001,第一个串如果变成 01101 ,也就是第 3 位的 0 和第 4 位的 1 交换位置的话,会被统计两次,但“或”的结果相同。
解决办法就是,在第一种可能里只换形成 1, 1 位置的 1,这样交换后,原位置的“或”结果不会改变。或者在第二种可能里只换形成 0, 1 位置的 0,理由相同。
第二题:争风吃醋的豚鼠
N个节点两两建边。不存在3个节点相互之前全部相连(3个节点连接成环)。最多能建立多少条边?
分析
15 期考过,可以参考其他人的文章,或问哥之前写的题解。但是值得一提的是,本题存在 的解法。
第三题:最长递增的区间长度
给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3(注意:测试用例仅做参考,我们会根据代码质量进行评分)
输入描述:第一行输入整数n。(1<=n<=10000)表示数组的大小。第二行给出n个整数a。(-1e9<=a<=1e9)
输出描述:输出答案。
示例:
示例 输入 6
5 2 3 8 1 9输出 3
分析
模板题。不用分析了,维护两个变量,一个表示最长当前连续递增区间的长度,一个表示所有递增区间里最长的长度,遍历数组,最后输出答案即可。
第四题:因数-数字游戏
小Q的柠檬汁做完了。掏出了自己的数字卡牌,想要和别人做数字游戏。可是她又不想要输掉游戏。她制定好规则,每次每个人只能把这个牌换成它的因子的某个牌。但是这个因子不能是1或者整数本身。现在给出整数n,两个人开始做游戏,先手在最优策略状态下能否必胜。
分析
14 期考过。还是可以参考问哥以前写的题解,虽然那时的经验还远不如现在。
一点点思考 - 不算总结的总结
陆陆续续参加了C站三十多场比赛(应该是只有两次没参加),稀里糊涂混了个积分榜第一名。我自知其实自己的实力远远配不上,所以线下也一直在对相关的算法知识点进行恶补学习。从这一点来看,我要感谢C站,通过比赛,认识到自己的不足,从而奋起直追,以赛代练,真正从比赛中获益。
半年过去了,我也做完了C站每日一练现有的所有题目(一百多道),并在其他刷题网站刷了不少题,收获颇丰。但是通过比较,发现C站的题目质量确实不高,当有了一定的基础知识后,很难再通过C站的题目来进步了。这还没有提到C站OJ系统的各种Bug,题目描述以及测试数据的各种歧义和错误。未来如果C站想把比赛办好,不仅提高题目的质量和数量,还要对已经存在的问题及时进行修正,但从目前的反馈来看,还有很长的路要走。
好了,字数差不多水够了。实在没什么好写的了,因为比赛会用到以前考过的题目,也就是说今天考过的,以后还有可能遇到。所以,以后的题解将主要以思路为主,文中尽量少放代码。至于那一百多道已通关的每日一练的题目,问哥打算有时间单独再开个专栏。