2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解

2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第1张图片

这题不用多说,排序就行了


2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第2张图片

直接枚举肯定超时,我们先求出所有四位的合法串,例如(2022,0001,0002),然后依次在合法串中枚举年份、月日、时间,然后组成日期检查合法性,合法串大概有360,然后判断年月日时间是不是同一个三位数和一位数


2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第3张图片

 这题没啥说的,每次取最大值赋给长边,最小值赋给短边,然后长边/2, 依次迭代几次就出来了


2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第4张图片暴力会超时,找规律发现 a1 * (a2 + a3 + .. + an) + a2*(a3 + a4 + ..) + ... + an-1 * (an),预处理后缀和,然后0(n)的时间复杂度可以过


2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第5张图片

首先最多只有八条边,只要三个矩形紧凑边一定可以凑出八条边的(可自行画图模拟),

然后我们枚举四条边的情况(可旋转):

2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第6张图片

 接着是六条边的情况      :

2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第7张图片

然后都没有就是八条边,直觉告诉我应该有公式可求,但是我最后还是写成了模拟


2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第8张图片

这题的x特别大,可能输入的时候就会爆long了,所以这是一个坑点,所以我直觉认为这题应该是trie树,只是没想到区间内选两位的trie树怎么求,所以我还是直接暴力了:用了点小技巧,先预处理保存了每个数和其他数异或为x的,然后排序,然后枚举区间内每个数的预处理数(异或为x的数),看边界是不是在区间里有交集(某个大佬说要用莫队分块...反正我听都没听过)


2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第9张图片

直接暴力肯定不可求,然后发现a+k 和 b+k的差值是固定的,并且a和b不同,假设最大公约数是D,那么a+k = x*D;b+k = y*D; x!=y; 且 |yD - xD| = |b - a|; |y-x|*D=|b-a|;D = |b-a|/|y-x|;x和y和D是整数,我们想使D最大,那么使y-x最小,由于y!=x,所以y-x最小取到1,可得到D此时为b-a, 得到公式(a + k) % |b-a|  == 0,k = |b-a|  - (a % |b-a|);特殊处理,如果此时 a % |b- a| == 0,那么k为0 


2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第10张图片

首先发现答案具有两端性,所以我们可以先二分,关键在于怎么判断len是否成立, 首先看任一段长度为len的区间[l, r];因为最多跳len,所以我们发现我们来回一定会经过区间内任一点,总共来回2*x次,区间内总和如果 < 2*x ,那么肯定不够来回的。所以我们枚举每一段长度为len的区间,如果区间内总和<2*x,那么长度len不成立,最后任意len长的区间都够的话就返回成立


2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第11张图片

直接暴力铁定会炸,我们观察发现某个数x,是x的约数,也是2*x、3*x、..的约数, 总共会被f[x], f[2*x]... 计算到,那么可以确定被计算n/x次,所以这个数的贡献值是 n/x * (x ^ 2),如果依次枚举每个数,n最多10^9,还是会超时,想来想去还是没想到对平方和怎么处理,现场也没时间想了;

(某个大佬说要用数论分块...反正我听都没听过)


2022年第十三届蓝桥杯省赛C组个人题解(JAVA)思路讲解_第12张图片

 我们贪心的想一想,连续修改k个数后,已经可以肯定区间内有k长的合法串,再加上左边的最长合法串 + 右边的最长合法串,就是修改这个区间后的最长串,其中需要判断左边的结尾是不是小于等于右边的开头,然后我们将k区间内的值修改成左边的结尾即合法了,至今还没有想到怎么短时间内求两边满足条件的最大区间和


严格来说,这题非常不友好,再给四个小时也不可能全部解出,对于C组来说,过于难了,而且B组的题还比C组简单,八道编程题没有几道题能暴力求,连第二道填空题都不能直接暴力,希望国赛简单一点吧。

你可能感兴趣的:(算法和数据结构,算法,数据结构,java,蓝桥杯)