![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
codeforce补题
文章平均质量分 57
codeforce补题计划
csu-yuuki
这个作者很懒,什么都没留下…
展开
-
Codeforces1575D
思路分析此题采用dfs,注意X选中了之后所有的X值相同,所以需要一个flag来存储X的值。注意前导0要单独讨论,然后就是当’X’或者’_'在第一位时不能选0,其它位可以选0 - 9 任意一个数。代码如下//now-当前位数 flag-X的值 num-当前数的大小#include <bits/stdc++.h>using namespace std;string s;int ans;void dfs(int now, int flag, int num){原创 2021-10-24 14:54:20 · 74 阅读 · 0 评论 -
Codeforces1573B
问题描述给你两个数组,a数组里面是1−2×n1 - 2\times n1−2×n中的奇数任意顺序排列组成,b数组里面是1−2×n1 - 2\times n1−2×n中的奇数任意顺序排列组成。问你最少需要多少次操作能让a的字典序小于b。思路分析首先我们要明确两个数组中的元素肯定不同,那么能造成两个数组的字典序大小的就只有两个数组第一个数的大小关系。所以我们只考虑第一个位置即可。那么如何来求最少?我们可以想到的是如果把a,b数组全部都排序,最后得到的b数组中的每一个元素都会大于a数组中该位置及以原创 2021-10-08 16:37:21 · 146 阅读 · 0 评论 -
Codeforces1514B
问题描述给你两个数n,kn,kn,k,问可以构造多少nnn个最大位数为kkk数按位与为000并且这nnn个数加起来最大的合法序列,答案对1e9+71e9 + 71e9+7取模。思路分析首先我们考虑这nnn个数按位与以后为000这个条件:我们可以知道,如果按位与为000的话,就代表着这nnn个数在每一位至少有一个数在这一位为000。其次考虑和最大,那么我们就可以这样想,既然每一位都会至少有一个数在这一位上为000,那么肯定是刚好一一对应最好,不然这些数加起来不会是最大。因此,我们对于每一位,都原创 2021-09-27 17:04:18 · 107 阅读 · 0 评论 -
Codeforces1527B1
题目描述游戏题,给一个只有000和111的回文串,对每一个人有两种操作:1、将这个串中任意的000变成111。2、如果当前串是非回文状态,可以将000和111排序。问最后谁会赢这场比赛。思路分析由于一开始就是回文串,那么对于Alice来说,只要她选了任意的一个000变成111,那么Bob来说,总能找到和她选的000对称的000,所以Bob必胜,因为Bob可以在最后一回合选择第二种操作。然后就是特殊情况,比如只有一个000,那么肯定是Bob赢。奇数个000,那么就证明这个000是在中心位置,A原创 2021-09-24 21:09:27 · 100 阅读 · 0 评论 -
Codefoces1529B
问题描述给你一组数,要你求满足条件的最长子串长度。条件是对于这个子串任意的(i,j)(i,j)(i,j)对,都有∣ai−aj∣>=MAX{|a_i - a_j|} >= MAX∣ai−aj∣>=MAX,MAXMAXMAX是指留下的子串中的最大值。思路分析实际上,很容易想到,在一组数中,每一个负数和000,我们都可以选上。那么剩下的就是非负数了,那么我们在这个地方就要小心,因为得出来的子串的∣ai−aj∣|a_i - a_j|∣ai−aj∣值不同,也没有大小顺序可言,原创 2021-09-24 18:19:12 · 79 阅读 · 0 评论 -
Codeforces1530C
问题描述参赛者在不同阶段获得成绩,我们只取k−⌊k/4⌋k - ⌊k / 4⌋k−⌊k/4⌋个最高成绩作为参赛者的总成绩。然后目前已经进行了nnn个阶段,但是不知道还会举行多少阶段会使第一个人的成绩大于等于第二个人的成绩。思路分析首先我们想想如何能使这个阶段数最少,那当然是让第一个人在接下来的阶段都是100100100分,第二个人都是000分,这样能保证阶段数最少。那么我们怎么来实现呢?在这里我们用的是前缀数组。那么对于每次加阶段的时候,我们对于第一个人就是加上100100100,然后可原创 2021-09-24 17:06:25 · 98 阅读 · 0 评论 -
Codeforces1534C
问题描述给你两列数,你可以每次将同一列的数上下交换,要你求出有多少种方案能使每一列每一行不出现重复的数字。思路分析如果把某一列两个数交换了的话,那么这两行必定有数出现两次,所以就要想办法把重复出现的数交换回去,这样的话,最后肯定会有一个正确方案。我们如何来算这个东西呢?经过上面的解释我们可以想到,如果有iii对数能够通过交换使得有一个正确方案的话,我们只需要找到共有多少这样的对即可。这样的对满足什么条件呢?其实我们把第一行该数连上与他同列的数,再将与他同列的数连上第一行这个数所在位置,然后再原创 2021-09-24 16:21:16 · 68 阅读 · 0 评论 -
Codeforces1534B
问题描述题目要求每个数与前面一个数之差的绝对值之和最小(默认最左端和最右端是000)。你能用一个代价将某个数减少111。使得每个数与前面一个数之差的绝对值之和以及代价之和最小并输出。思路分析我们考虑一个数和他左右相邻的数。如果两个数都比他大的话,他去减一,那么贡献将会是+3+3+3。一个数比他大,一个数比他小的话,他去减一,贡献将会是+1+1+1。两个数都比他小,他去减一,那么贡献将会是−1-1−1。所以我们只需要找到每一个比他左右都大的数,并且把他减到左右最大的那个数即可。代码原创 2021-09-24 11:36:58 · 80 阅读 · 0 评论 -
Codeforces1574C
问题描述给你nnn个英雄,每个英雄的能力值为aia_iai,然后有两条龙,你必须派一个英雄去杀其中一条龙,然后派其他的英雄去防御另外一条龙。注意,你选择的英雄的能力值必须要比龙的能力值大,并且,你可以用1coin1coin1coin去提升一位英雄的能力值(当然只提升111点)。要你求能杀死一条龙并且防御另外一条龙的最小代价。思路分析我们直接找到刚好比第一条龙能力值大于等于或者小于等于的英雄去杀那条龙,比较一下两种情况的代价大小即可。代码如下#include <bits/stdc+原创 2021-09-24 11:09:30 · 137 阅读 · 0 评论 -
Codeforces1574B
问题描述给你三个数a,b,ca,b,ca,b,c,问你是否可以形成一个有mmm对相邻相等的字母对。思路分析我们可以知道,给你的a,b,ca,b,ca,b,c分别代表着A,B,CA,B,CA,B,C的个数。那么我们最多可以得到多少对相邻相等的字母对呢?答案自然是a+b+c−3a + b + c - 3a+b+c−3,为什么呢?因为我们可以知道如果所有相同的字母全部放在一起的话,能形成的对数就是个数减一。我们从最多对数那里看,我们是否能通过某种操作只使这个对数减一呢?答案无疑使肯定的,我们可以把原创 2021-09-24 10:50:47 · 130 阅读 · 0 评论 -
Codeforces1536B
问题描述给你一个字符串,找到最小的没有在字符串中出现的子串。这里的最小是指,长度最小并且字典序小。思路分析观察到n<=1000n <= 1000n<=1000,所以不用想的是,不可能每一个长度为333的子串都出现(计算一下很好得出这个结论),所以我们可以用向量把长度为333以内的子串储存,然后对每一个在向量中的串在原主串中查找,如果找不到,那么就代表这个子串没有在原主串中出现,输出即可。代码如下#include <bits/stdc++.h>using n原创 2021-09-24 10:29:01 · 132 阅读 · 0 评论 -
Codeforces1566D1
问题描述这个题目要求有多少对i<ji < ji<j满足ai<aja_i < a_jai<aj思路分析我们直接在读入的时候就用multiset对之前读入的数排序好,再用迭代器找到比当前读入数小的数的个数即可代码如下#include <bits/stdc++.h>using namespace std;const int maxn = 310;int a[maxn];multiset<int> s;int main()原创 2021-09-24 10:18:02 · 81 阅读 · 0 评论 -
Codeforces1537C
问题描述又是给你一组数,要求你求出一个序列,使得第一个数和最后一个数的差值的绝对值最小,并且尽可能使前一项小于后一项思路分析首先俺们先排序然后找到差值绝对值最小的两个数,把其中小的数安排在最左侧,大的安排在最右侧。其次,我们刚刚选择的两个数刚好是两个相邻的数(想一想为什么? 当然是两个相邻的数差值最小啊),然后我们就安排比这个较大数的右侧的数(比这个数大)安排在左侧的后面,再从第一个到较小的这个数安排在之前安排的后面。(即中间会有个骤降的两个数,这样能保证除了中间这个骤降的数外其他的数都是递增原创 2021-09-23 20:28:59 · 122 阅读 · 0 评论 -
Codeforces1538C
问题描述给一组数,找到有多少对(i,j)(i,j)(i,j)(i<j)(i < j)(i<j)满足l<=ai+aj<=rl <= {a_i + a_j} <= rl<=ai+aj<=r。思路分析由于我们要求的是ai+aja_i + a_jai+aj,所以无需考虑i<ji < ji<j这个条件。那么我们可以这样想,首先把这组数排序,然后对于每一个aia_iai用lowerboundlowerboundlowerbo原创 2021-09-23 20:05:55 · 83 阅读 · 0 评论 -
Codeforces1539C
问题描述给你一组数,给你kkk次机会加一位任意成绩的学生,要你求出能把这组数划分成多少个(最多)稳定的小组。稳定的小组是指这个小组按成绩的大小排序后,每个学生和与他相邻并且比他成绩小的同学的成绩差小于给你的一个数xxx。即ai+1−ai<=xa_{i + 1} - a_{i} <= xai+1−ai<=x。思路分析因为题目要我们求能得到最多多少组的稳定的小组,那么我们应该把不满足要求即两位同学成绩之差大于xxx的成绩差放到一个数组或者向量中。因为我们只是把成绩按大小排序了原创 2021-09-23 19:36:36 · 92 阅读 · 0 评论 -
Codeforces1539A
问题描述给出每个人的开始时间和持续时间,要求不满意度。不满意度的产生就是这个人的结束时间比后面多少个人的开始时间晚。思路分析我们直接找规律,第i个人结束时间为t+x×(i−1)t + x \times (i - 1)t+x×(i−1)见下图代码如下#include <bits/stdc++.h>using namespace std;#define ll long longint main(){ int k; ios::sync_wi原创 2021-09-23 19:05:06 · 134 阅读 · 0 评论 -
Codeforces1541B
问题描述给一个组数,找出一共有多少对(i,j)(i,j)(i,j)符合i<ji < ji<j并且ai×aj=i+ja_i\times a_j = i + jai×aj=i+j思路分析代码如下#include <bits/stdc++.h>using namespace std;#define ll long longconst int maxn = 2e5 + 10;ll a[maxn];int main(){ ios::sync_w原创 2021-09-23 17:25:34 · 117 阅读 · 0 评论 -
Codeforces1566C
问题描述给一个两行的矩阵,要求最大的MEX值MEX值是指在所选的几列中未出现值的最小值那么假设所选几列中既有1又有0的话他的MEX就是2,依此类推思路分析首先,我们先找出矩阵中既有000又有111的那一列,因为他的贡献为222,并且我们需要把这样的列单独拿出来(使得答案最大)在进行上一步操作后,所剩下的列就是只有000000和111111的了,那么对于单独的000000,他的贡献显然为111,单独的111111,他的贡献显然为000,那么对于两列呢?如果我们能找到相邻两列分别只有000,原创 2021-09-23 17:12:22 · 148 阅读 · 0 评论