cf刷题笔记
机械之忍
y门门外弟子
展开
-
Codeforces C. Andrew and Stones
题目大意:一个操作定义如下:每次选三个下标1<=i<j<k<=n,把a[j]的值减2然后各给a[i]和a[k]加1问能不能把2~n-1的所有元素归0,如果能,输出最小次数思路:本题细节较多,需要考虑周全,不然容易wa,首先在读入的时候就先看看有没有偶数出现。如果有,无论如何都是有解的,因为偶数自己可以归0,这样的话就总能拿出1个1去把奇数凑成偶数。如果没有,也不要紧,因为大于1的奇数也可以自减,然后拿出1个1去凑别的奇数,但注意,大于1的奇数自己不能归0,需...原创 2022-02-14 00:10:37 · 774 阅读 · 2 评论 -
Codeforces B. MEX and Array
题目大意:给定一个序列,求出一个最大的sum,sum定义:对于一个片段,他的分割后的片段数+分割后每个片段的mex值之和设为X,sum就等于给出序列的所有子片段的X值和思路:首先要求出最大的sum就要保证每个子段的X最大,而仔细观察不难发现,对于任意片段,其X的最大值等于其片段长度加片段中0的数量,这个结论为什么正确呢?举个例子,如片段{0,1,2},他的X值是1+3=4,而无论如何分割,他的X值最大为4,如{0},{1},{2}{0,1},{2}{0},{1,2}这些值不可...原创 2022-02-13 23:54:15 · 751 阅读 · 0 评论 -
Codeforces C. Monsters And Spells
思路:本题比较难想,但一旦想到是区间合并的话就很简单了,对于每个数就扩成一个区间去处理就完事了,合并完区间后会发现每个区间的长度之和就是答案Code:#include<iostream>#include<cstring>#include<algorithm>#include<vector>using namespace std;typedef pair<int,int> PII;const int N =...原创 2022-01-24 00:23:34 · 516 阅读 · 0 评论 -
Codeforces B. Minor Reduction
思路:注意分类讨论,首先如果选出的两个数加起来小于10,那序列位数减少,值必然变小,但相对于这一位来说必然变大(如2+3=5)或者不变(如1+0=1),所以必须让这种情况尽量靠前。如果两个数加起来大于10,那相对于这两位来说必然变小(如2+8=10)或者不变(1+9=10),所以必须让这种情况尽量靠后。由于这两种情况的处理方法是对立的,所以分两种情况,存在加起来大于10的情况和不存在加起来大于10的情况分别讨论。Code:#include <iostream>...原创 2022-01-24 00:16:24 · 516 阅读 · 0 评论 -
Codeforces B. Card Deck
思路:首先贪心肯定是不择手段的把大的数放在最前面,这种平方级运算大数必须靠前,不然低平方的常数再大也不肯能弥补高平方,所以这题就变成了找最大值了,预处理出来整个区间的前缀最值就行了,但遍历得倒着遍历,因为预处理的是前缀最值,倒序遍历到的前缀最值必然是当前前缀最大的,正序遍历则不能保证,因为后面可能还有更大的,然后遍历到了就输出当前片段即可Code:#include <iostream>#include <cstring>#includ...原创 2022-01-24 00:05:32 · 221 阅读 · 0 评论 -
Codeforces 1624C Division by Two and Permutation
思路:首先大于n的数肯定不能放,不断/2至小于等于n再考虑,其次对于任意小于等于n的元素,一定是能放则放,放不下就/2退位。不要想明明能放却不放,先去补更小的空位,这样看似合理,但一定不正确,因为你去补更小的空位,本该属于你的位置就空出来了,就又得有新的元素去救,但你会发现,这个元素一定能不断/2最终变成你去补的元素,所以这就多次一举了。Code:#include <iostream>#include <cstring>#include <...原创 2022-01-12 01:06:32 · 319 阅读 · 0 评论 -
Codeforces 1480B The Great Hero
思路:本题的核心转化:即使打败完所有敌人后英雄再死亡也可以,这就等于英雄在受到致命伤害后可以免疫一次,如果能想到这个这题就简单了。计算英雄攻击回合数的公式:怪物血量/英雄攻击力,上取整Code:#include <iostream>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int N = 1e5+10;...原创 2022-01-12 00:57:51 · 149 阅读 · 0 评论 -
Codeforces 1607D Blue-Red Permutation
题目大意:给一个整数序列和一个字符串,字符串的每位字符对应序列的每位数字,对于整数序列,字符是B则只能减,字符是R则只能加,问能不能通过上述操作使序列变成1~n的排列思路:本题贪心思路确实难想,应该是按字符排序,保证先处理完全部的B再处理A,因为用for循环枚举处理1~n的每个数的时候必须减法优先,原因是只有从小到大处理才能包含整个1~n的序列。这道题的贪心表面上是排序数字,从小往大贪心,其实是排序字母,从减法往加法贪心Code:#include <iostream&...原创 2021-12-14 22:35:50 · 1069 阅读 · 0 评论 -
Codeforces 1566B
题目大意:可以任意切割给定序列,对于任意序列,其MEX值等于该序列未出现的最小整数,求给定序列的最小的总MEX值,即所有切割后序列的MEX值之和思路:我个人做这个题时分了三种情况,首先全1不用说,怎么都是0,全0的话越切越大,所以必然是1,所以这题就成了处理01混搭的序列,而对最小值最有影响的是0,因为一旦单分出0,MEX值就要+1,所以自然想到指针的思想遍历序列,但这里需注意,找的是连续的0片段数量,不然最终求的MEX值必然大于等于最小值。Code:#include <io..原创 2021-12-01 23:27:09 · 198 阅读 · 1 评论 -
Codeforces 1593C
题目大意:给出老鼠和洞坐标,每次老鼠方只能有一只老鼠移动一步,猫也移动一步,问最多有几只老鼠能进洞思路:从右往左贪心一下,由于每次只能移动一只老鼠,所以本题与某个位置的老鼠数量无关,所以按照离洞由近至远的顺序枚举一下总步数,总步数应小于n,不然猫会追上最后一只老鼠。每只老鼠进洞需要的步数应为n-a[i]Code:#include <iostream>#include <cstring>#include <algorithm>using...原创 2021-11-30 22:41:23 · 858 阅读 · 1 评论 -
Codeforces 1592A
题目大意:给出一堆武器伤害,特工不能连续使用同一种武器,请问特工至少需要几步把敌人击杀思路:贪心一下,只需在前两个最高伤害的武器间反复切换攻击就行,所以只需考虑反复切换几次才能击杀敌人,但注意考虑特殊情况,不要有遗漏。Code:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 2010;typedef l...原创 2021-11-30 22:33:25 · 465 阅读 · 1 评论 -
Codeforces 1611A
题目大意:可执行任意次操作, 操作内容:翻转前k位,但必须是严格1~k,不能跳着翻转。问最少执行几次操作使该数字变成偶数思路:其实合法情况只有三种,0、1、2,0就是本来就是偶数,不用操作,1就是第1位恰好是偶数,这样直接翻转整个序列就能把偶数转到最后了,2代表偶数在其他位置,由于只能翻转1~k位,所以需要先把偶数转到首位,再整体翻转。如果该数字没有一个偶数位自然就是无解Code:#include <iostream>#include <cstring&g...原创 2021-11-29 23:07:46 · 339 阅读 · 0 评论 -
Codeforces 1609A
题目大意:可执行任意次操作,操作内容:找两个元素,其中一个必须是偶数,偶数元素除2,另一个元素乘2,问怎么做才能使整个数组元素之和最大思路:初步思路使放大某个元素,把除该元素外所有的元素都除/2到底,以此使该元素放到最大,这样肯定比均分求和要大,但这个元素如何选择?应该选底数最大的,也就是说把数组内所有元素一直除2直到不能除为止,然后从这些数里挑最大的放大,由于底数更大,所以每次乘2放大肯定也更大Code:#include <iostream>#include ...原创 2021-11-29 22:55:35 · 215 阅读 · 0 评论 -
Codeforces 1607C
题目大意:每次找到序列的最小值,删除最小值,然后剩余所有元素减去该值,反复执行这个操作,直到序列就剩一个元素,问反复执行该操作的过程中,出现的最小值最大是多少思路:其实仔细观察不难发现,这个题的本质就是序列从小到大排序后的后一项与前一项元素的差,然后输出所有的差里最大的,因为你会发现这个操作只跟最小值和次小值有关。Code:#include <iostream>#include <cstring>#include <algorithm>...原创 2021-11-25 22:10:46 · 185 阅读 · 0 评论 -
Codeforces 1610B
题目大意:以回文顺序遍历整个序列,可以删除不对称的元素,但只能删一种元素的任意个,问能不能删除一种元素的任意个使序列变成回文序列思路:以回文顺序遍历序列的时候,不对称的元素必然成对出现,所以只需枚举一下这两个元素即可,具体细节见代码Code:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 2e5+10;i...原创 2021-11-25 21:58:40 · 579 阅读 · 0 评论