本文为codeforces 1600分,顺序以过题人数为排序关键字的题目题解
目前已更新前50题
Problem - 431C - K-tree
标签:类似背包dp
思路:
- f[i][0/1]走到某一点时,表示总得分为i时,是否满足要求的路径
- 这一种分值可以从k种路线走过来,所以二重循环枚举 1 < j < m i n ( i , k ) 1<j<min(i,k) 1<j<min(i,k)
- 复杂度:O(n*k)
Good subarrays/1398/C
标签:数学推导
思路:
- 由原式可得: S r − S l − 1 = r − ( l − 1 ) S_r-S_{l-1}=r-(l-1) Sr−Sl−1=r−(l−1),进一步推导为 S r − r = S l − 1 − ( l − 1 ) S_r-r=S_{l-1}-(l-1) Sr−r=Sl−1−(l−1),所以从前往后不断扫描记录 S i − i S_i-i Si−i的相等情况即可。
- 复杂度:O(nlogn)
Problem - 371C - Hamburgers
标签:二分答案
思路:
- 如果是正向思考需要三个数字反复补缺,所以考虑验证答案。
- 于是可以每次验证是否能做这么多个汉堡来二分答案。
- 复杂度:O(logn)
Spreadsheet - CodeForces 1B - Virtual Judge (vjudge.net)
标签:进制转化
思路:
- 字母转化成数字毫无疑问,为26进制转化。
- 数字转化为字母,因为没有0,每个数字都是[1,26]。
- n u m = ∑ i = 0 n − 1 a i ∗ 2 6 i num=\sum_{i=0}^{n-1}a_i*26^i num=∑i=0n−1ai∗26i
=> n u m = a 0 + ∑ i = 1 n − 1 a i ∗ 2 6 i num=a_0+\sum_{i=1}^{n-1}a_i*26^i num=a0+∑i=1n−1ai∗26i( a 0 a_0 a0系数为1,所以原式等价为此式子)
=> n u m − 1 = a 0 − 1 + ∑ i = 1 n − 1 a i ∗ 2 6 i num-1=a_0-1+\sum_{i=1}^{n-1}a_i*26^i num−1=a0−1+∑i=1n−1ai∗26i
此时就转化为了26进制,不断除以26,就可以又得到 a i a_i ai - 推荐文章:没有0的进制 - 何太狼 - 博客园 (cnblogs.com)
Problem - 377A - Maze
标签:一般dfs
思路:
1.直接dfs,当有一个格子无法继续延伸的时候,就可以将这个格子填充为X
2.这题样例略弱,写了个错的代码仍未被hack,有兴趣的可以来看看。(错误链接:Submission #250448284 - Codeforces)
Problem - 1526C2 - Potions
标签:反悔贪心
思路:
- 如果到达某一个负数值的位置的时候, S S S小于了0,那么就去掉前面一个最小的负数。
- 可以使用优先队列实现该算法。
Problem - 1352G - Special permutation
标签:构造题
思路:
- 为了保证每个数字的间隔为2,所以可以想到分奇偶。
- 考虑对于3 1 4 2这个原式序列,如果在左边只放奇数,右边只放偶数,那么所形成的序列刚好满足要求
Problem - 1336A - Linova and kingdom
标签:树形dp
思路:
- 可以发现,从下到上设置关键节点是最优的。
- 其次如果将一个节点设置为关键节点,则会发现总权值将产生 d e p i − S i z i + 1 dep_i-Siz_{i}+1 depi−Siz