十一月训练记录

2022/11/1:

104. 货仓选址 - AcWing题库

再次做一遍竟然错了,没有仔细分析题目,而是直接猜中点,(不可取,受到之前一个题目的影响)实际上这一题取的是中位数,因为要求的是所有点到货仓距离和。

Problem - B - Codeforces 

这一题异曲同工,不过这个B题求的是集合最短时间,只取决于最右边和最左边的时间,故最后的答案为中点。 

717. 简单斐波那契 - AcWing题库

用数组递推,不用递归。

796. 子矩阵的和 - AcWing题库

二维前缀和,图解法更好懂。

 1216. 饮料换购 - AcWing题库

每三个空瓶换一瓶饮料(喝完后也是空瓶),饮料数/3即为可换饮料,每次更新空瓶数即可。 

1236. 递增三元组 - AcWing题库

直接暴力不行,优化,由数据量知该题时间复杂度为O(nlogn)或者O(n),故最多遍历一个数组,最好是遍历B数组,这样A和C数组是独立的,故可二分查找A和C中合题意的数量。又数据量范围小,还可以用前缀和预处理,从而达到O(n)的时间复杂度。 

2022/11/2: 

补十月的题...

2022/11/3:

95. 费解的开关 - AcWing题库

2022/11/4:

题记:晚上的比赛有点浮躁了,开始第一题做的挺快的,然后就有点放松,第二题没仔细审题,从而错误了很多次,第三题没有仔细找规律,而是单纯去猜,第二天看了别人的代码加自己的总结才知道。

Dashboard - Codeforces Round #832 (Div. 2) - Codeforces

A:把数组分成两份,拿两份之和绝对值相减,最好的办法是把正数放在一块,负数放一块。

B:给定一个BAN循环字符串,问最少交换几次后,改字符串中没有BAN字串,开始以为只需要不出现BAN就行了,结果字串的定义是,删除若干个字符得到BAN也算,没有仔细审题...

C:可以发现对于A而言,只需要与1交换,就可以保证最后A胜利,换句话说,只要0出现在a[2-n]中A就获胜,那么每次操作,A可以将a[1]--,并将a[2-n]中的一个数调到a[1]处。A最好是将最小的数(1)交换到a[1],然后a[2-n]中就会出现0,那么这个前提条件为a[1]要大于a[2-n]中的一个数,A可以一直使用这个数,直到他变为1。换句话来说a[1]要大于a[2-n]的最小值。

2022/11/5:

1204. 错误票据 - AcWing题库

中点在于如何读取数据,可采用字符串的方式,然后将字符串中的数字转为整形。首先读入的时候要用getline吃掉一个换行。最后按照题目意思模拟找到不符合条件的即可。

2. 01背包问题 - AcWing题库

还是背包问题,找到状态方程,先用二维解,然后再优化成一维。

 

 注意二维的第二个循环必须从0开始,否则丢失一些数据。

2022/11/6:

Dashboard - CodeTON Round 3 (Div. 1 + Div. 2, Rated, Prizes!) - Codeforces

状态比较好!!!比较快的写出了三题。 

A:思维题,可以发现有一个操作没用,因为不合题意,会破坏非降序结构,所以只能选择交换的操作,又数组为一个排列,所以1必须在第一个位置,不然怎么也不可能非降序,又由操作可知,后面的数都可以交换位置,故只需要1在第一个位置即可。

B:贪心题,最大消费只有三种可能,其中x*y的时候最大一定为输入字符串s,因为他的每一个字串的x*y一定小于主串。而单独连续出现0和1时分别计算最大值,最后取最大值即可。

C:构造题,先将a中的所有1变为0再说,再看b,如果b中已经全为0,那么直接输出记录的操作即可,如果全为1,那么可以对a操作三步,使a和b同时都变为0,前两步化b为0,最后一步将a全部转置,如果有0也有1那么不可使a,b全部为0,这里在对b进行翻转操作的时候用了差分数组,记录每个位置的翻转次数,如果为奇数则需要翻转。 

2022/11/7:

93. 递归实现组合型枚举 - AcWing题库

枚举组合数dfs,注意不要枚举前面已经枚举过的数,用三个变量进行dfs,可不用vis数组。

若为排列,必须要有vis数组。

2022/11/8:

复习素数筛:

466. 回文日期 - AcWing题库

初看以为从10000000枚举到99999999所有数,因为为日期,所以他有固定格式,所以只需要先预处理回文日期,即知道年份求其回文,再判断该月份是否合法即可,合法则记录下该年份的回文日期,然后根据所给起止日期,一个个判断即可,对于始末年份位置进行特判。中间年份直接遍历即可。

788. 逆序对的数量 - AcWing题库

在归并排序的基础上改动一点即可求逆序对。 

 

2022/11/9:

1101. 献给阿尔吉侬的花束 - AcWing题库

bfs搜索模板,队列加结构体。

1113. 红与黑 - AcWing题库 

只需将上题的代码稍作修改即可。 

1224. 交换瓶子 - AcWing题库

由贪心思想和数据范围可得解法一: 

 将问题转化成环的问题,判断有多少个环:

2022/11/10:

Dashboard - CodeTON Round 3 (Div. 1 + Div. 2, Rated, Prizes!) - Codeforces

D:

4714. 数对 - AcWing题库

Acwing周赛B题,可由数对性质推得,字符串中相同字符的个数为突破点,关于一个字符数对的求法:设相同个数为n,则数对个数为n+C2n(n个位置中取两个位置)*2(数对和位置顺序有关),化简得为n*n;所以最后总和为所以相同数个数的平方和。

2022/11/12:

112. 雷达设备 - AcWing题库

求每个岛屿可放雷达的区间范围,化为区间问题,当多个区间重叠时,即有公共区间时,雷达加一。 

2022/11/13:

Dashboard - Codeforces Round #833 (Div. 2) - Codeforces

A:模拟前几个答案,很容易找到规律。

B:直接暴力枚举加一点优化即可,由题该字串最大长度不可能超过100,故在每一个字符以100枚举 。

C:前缀和思想,一个0能进行一个操作,操作能使当前位置及后面的几个位置的前缀和为0,那么如果有多个0的话,以每两个0为一个区间(左闭右开),在该区间内,取个数出现最多的数,让他们的前缀和为0,循环该操作即可,还要记得加上第一个0出现之前本身前缀和就为0的位置个数,重点在于怎么求区间内出现次数最多的数,同时还要记录下他的大小,因为每一次操作,都会影响后面的前缀和,即需要更新操作,在图上画出,设未知数,求最优策略是最好的办法。

2022/11/16:

1221. 四平方和 - AcWing题库

可以直接暴力前三个数第四个数由公式得出,取第一个符合题意的即可,但是现数据加强,可以先存下后两个满足题意的数(若和相等取最先出现的,可以直接用数组存),再遍历前两个数,看看c+d是否有符合题意的。

2022/11/17:

730. 机器人跳跃问题 - AcWing题库

注意审题,可以发现是一个二分答案的问题,开始把乘号和下标给看错了,出现题意混淆,后面处理溢出问题发现开了long long仍然溢出,于是用double处理。 

1209. 带分数 - AcWing题库

1015. 摘花生 - AcWing题库

一开始用bfs跑,内存超限,显然对于每一个位置有两种可能,那么总共有2^n种可能,而n可达100!!! 用线性DP优化。

2022/11/18:

Dashboard - Codeforces Round #834 (Div. 3) - Codeforces

A:直接模拟即可,判断答案开头是否为Yes中某一个字符,然后一直循环下去即为正确答案。

B:拿s减去数组中排列未出现的数,若已经为0,那一定可以实现,若不为0,则继续减去排列后面未出现的数,直到s==0或者s<0,当s等于0时,一定可以实现,小于0时不能实现。

C:首先考虑能不能不动,此时对应的是 a=b 的情况;

之后考虑能不能一步从 a 到 b ,此时对应的是 |a−b|=b−a≥x 的情况;

然后考虑能不能两步从 a 走到 b ,这时候需要 l,r 中的一个边界点作为中转点,也就是说,此时对应的分别是 a−l≥x  or  r−b≤x 这两种情况。

最后考虑能不能散步从 a 走到 b ,这时候需要两个边界点都作为中转点,对应的是 r−a≥x,b−l≥x 的情况。

如果上述条件都不满足,说明从 b 出发以后,调整不到任何温度,也就根本无法调整到 a 了。

E:一共三瓶药水,有两瓶是一样的,那么一共只有三种先后使用方法,不妨设为【2,2,3】,【2,3,2】,【3,2,2】。每次战斗力不够的时候使用药水即可。

2022/11/19:

第五届“传智杯”全国大学生计算机大赛(练习赛) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

A:就是map记录下出现了过的字符串,只要没出现过就加到答案里。

B:预处理所有时间段的答案,然后以周期为单位,取模运算即可。这里就有0:00属于一开始呢还是最后呢的问题,我们归结为属于24:00,然后一开始就将答案加一,让一开始的0:00不进入我们的考虑范围,然后24小时只有从0:12开始的到最后24:00的0:00,这样就好统计了。

C:首先购买最贵的,然后我们才能拿着这个贵的开始交换,然后当然是从最小的开始交换,直到自己物品价值不够。

D: 每连续i分钟灰尘落i个,有人的时候不会落灰尘,那么可以用一个数组用来保存灰尘从何时开始落下,当人到达该位置时,对此前的灰尘计数,并更新开始落灰尘的时间(即当前时间+2),最后再对所有位置的灰尘数进行计数,让时间为m分钟时,对每个位置的灰尘数进行更新,主要看该位置从什么时候开始落灰!

2022/11/20:

Dashboard - Codeforces Round #834 (Div. 3) - Codeforces

D:考虑每一个末尾 0 如何最优的产生。 在朴素状态中,我们想要末尾增加一个 0 ,需要让整个数扩大 10 倍,这个消耗无疑是很大的。但是有没有更少的方法呢?我们发现 2∗5=10 ,也就是说在 a 中,可能存在着 2 和 5 的因子。每一对 2 和 5 都组成一个 10 。那么多余的 2 或者 5 怎么办呢?显然让原来的数扩大 2 倍或者 5 倍就可以多增加一个 0 ,就不需要增加 10 倍了。先处理多余的 2 和 5 再考虑 10 ,最后记得最大化, d 表示我们当前使用 d 个 b 可以使得 0 最多,再乘上 bd 即可。

F:显然答案不会大于等于 p ,即只需要考虑 an 关于缺失数字的大小即可,用 set 存出现过的数。
如果没有小于 an 的缺失数字,就不需要进位,设最大的缺失数字为 mx (不存在则设为 an ),答案为 mx−an 。
如果有小于 an 的缺失数字,则必须进位。进位后,一定会出现 0 以及模拟进位后变化的最高位的数字,需要纳入 set 。随后找到小于 an 的最大缺失数字 mx (不存在则设为 0 ),答案为 mx+p−an 。因为给出的数字最多只有 100 个,所以每次找数字的次数不会超过 100 次。

G:先判断给出数组有没有重复的数,若有肯定不能构成排列,再来进行选数,我们让越小的数在前面越好,这样可以使得数组最小,换句话来说,后面的数的前一个数应该是未出现数中小于该数的最大值,即第一个小于等于该数的数,可以用二分查找来做,找到之后在未出现数中删除该数,并记录该数为当前数的前一个数,若未找到则无法形成排列。

2022/11/21:

新生赛重现加备考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值