今天是非常自闭的一天
上午非常激动!看到了吉ls真人!!然后就开始自闭了,吉ls来给我们讲数论,总共讲了六个知识点,就欧几里得、拓欧、类欧还有筛法哪一快可能听的明白点,其他纯循环数列和混循环数列的区分和性质还有中国剩余定理啥的。。勉强跟着听记了一团笔记,推理的过程并没有弄懂,很难受。后期再根据知识点学习吧。。(又欠了一屁股账了,难受)
下午的题目是唐ls出的,今天只A掉了一道题
A.Erase Numbers II
题目给了n个正整数a1,a2......an,要求从中去掉两个数后,剩余数连在一起所组成的数最大,求这个最大的数
其实就是从这个数组中选两个数连起来最大,tls讲的是把长度最大的数枚举各种可能的组合并比较,当然这里长度最大的两个数有长度相等和不相等两种情况,因为可能长度最大的数只有一个,所以另一个数就需要从长度为最大值-1的数里面选取了。因为要枚举所以复杂度是O(n^2)。队友过的方法是选出这n个数中最大的一个,然后以其为分界线将数列分为两边,找出两边的最大值,然后分别和这个最大的数连起来并比较大小,更大的那个就是要求的值。
首先考虑取的是两个长度不相等的数,那么长度更大的数肯定也是数列的最大值定为A,然后考虑取长度第二大的哪个数与其组合,这时分为两种情况,即第二个数在A前面,或第二个数在A后面,将选取的数定为B。若B在A前面,那么B必定为A前面的数中,最大的那一个,为什么呢,设A的长度为L,组合出来的数为(BA),所以数(BA) =B*10^L + A,(BA)与B成正相关,所以B最大(AB)才最大 。同理可知当B在A后面时,B也为A后的数的最大数。
再考虑两个数的长度都相等,如果同样要取整个数列中的最大值我们就可以按上面的方法证明。
假设A为数列中的最大值,所得数为(BC)时最大,A,B,C长度均为L,且A≥B≥C,若A在B前面,则
(AB) = AeL+B,(BC)=BeL+C
由于A>=B,所以AeL ≥BeL --> (AB)>=(BC),当且仅当A=B=C时取等号。所以(AB)是最大值。
同理若A在B后面亦可证(BA)>=(BC),所以A必需要取。
取最大值之后即可按第一类的方法求出最大值。
然后这个题有个坑点就是ai的数据范围到1e9,两个数连起来就有1e18了刚好把long long给卡掉,需要用unsigned long long或者__int128。队友刚开始嫌C++字符串转int麻烦,拿Java写了半天RE了又返回来拿C++写才过掉。
B.Erase Numbers I
题目描述和上一题差不多,区别就在于上一题是要去除(n-2)个数,而这一题只用去除2个数字。
这个题我们并没有过掉,但是思路其实是对的。位数小的数字肯定优先考虑去除掉,如果还能继续去除,那么余下的数中就要考虑位数相同的时候如何选取去除哪一个数能使结果更大。思路是从头开始遍历所有的位数最小的数,每遍历到一个数,就将它与它后面的那个数进行一位一位的比较,更大就保留(如果相等的就很复杂),更小就去除,直到总数除够两个数。那么还有种情况就是遍历完所有的最小的数之后还每除够两个数,那么就从后往前直接去除掉位数最小的数。
之后我们就考虑到相等情况下要进入后面数的范围继续按位比较,然后就有可能会有特别毒瘤的数据,刚好最小的数为整个数列的一个循环节,那么就需要比较9*6000*2000次,直接爆炸,tls讲后知道可以用后缀数组进行预处理优化掉这个问题。
H.Cosmic Cleaner
模板题,然鹅队友并没有把板子改好,没A掉。球缺的体积公式 V=(π/3)(3R-H)*H^2(R是球的半径,H是球缺的高)。
K.Sticks
给12根木棒的长度,问最多能凑出几个三角形,并输出凑的方案。
不知道为什么一上来排个序就直接开始贪心了,然后WA了一发之后又构造了一个循环数组继续贪, 然后又WA了。0.0
正解是个搜索,将12根木棒分为4组,每组3根,然后判断能不能组成三角形。这时候复杂度是C(12,3)*C(9,3)*C(6,3)
但是还是有可能出现重复的情况,比如第一次分(1,2,3)(4,5,6)(7,8,9)(10,11,12)然后第二次分了(1,2,3)(7,8,9)(4,5,6)(10,11,12)这样的情况,需要除序,复杂度再除A(4,4),实际的操作方法tls讲的是默认每一组必须包含当前未分配的木棒中最小的那一个,这样实际的复杂度可以达到C(11,2)*C(8,2)*C(5,2)/A(4,4),跑的很快就能过。
L.Pyramid
队友写A题的时候我不知天高地厚的去看了L题。。。
题意是一个金字塔的侧面可以由很多等边三角形构成,有q次询问,每次询问求l层到r层之间有多少个等边三角形。
我分了半天类把各种可能的情况都数出来了,然后是O(n^2)的复杂度,没有优化交一发WA了。后来tls讲题解的时候是用好厉害好厉害的数学方法解的。。完全没听懂。。。
总结一下今天的过程,过了的题就一道呀。。。非常自闭。
很多题目看到的第一反应都是贪心,而不是搜索枚举之类可靠性更强的算法,思路老是往贪心方向走非常不好。然后平常对一些处理数据的方法掌握的不熟练吧,比如B题就没有想到用后缀数组来优化。对很多数据结构往往也是浅尝辄止,没有多加练习,实际运用起来还是存在很大的困难,也是以后要注意的一个问题。与昨天相比今天有意识的在检查代码的时候注意数据范围。
数论好难。。。