模拟四补题报告

Hello,everyone!距离复赛开考还有17天,各大网校,线下培训已经开始了加急的训练,下面让我们来看看我的第四套模拟赛的补题报告吧~

前天是国庆节,祝大家上个国庆节快乐!

一.题目报告

比赛中0题AC,简称报0(大悲)不想说啥了,我是个无奈又弱小的蒟蒻。。。

二.赛中情况

先去做了B题,样例过了但就是没对,后又去做了C题,没软用,整不出来,看了眼D题去做A了,A其实还好,硬模拟就能做出来,但是A是A不了的,这一辈子都不可能,D。。。这是给碳基生物做的题吗,反正我是蒟蒻(乐)

三.题解报告

T1:复读机(repeater)

题目大意:

人类的本质是复读机。

现在给定一个长度为 n 的仅包含小写字母和数字的字符串,字母表示需要复读的消息,数字表示要复读的次数。
例如kdy3,表示将kdy复读3遍,输出为:kdykdykdy
然而复读没有这么简单,某人想进行一个更复杂的复读模拟,于是这个字符串中可能包含多个数字,当多次出现数字时,例如 a5b2,我们从左到右解析这个字符串, 表示将a复读 5 遍,即原字符串变aaaaab为 ,然后遇到数字 2 ,再将所有消息全部复读 2 遍,即aaaaabaaaaab。

题目解析:

输入一个字符串,遍历一遍,找到数字n就输出前面的字符串n次,又有新的数字就再输出一遍之前的字符串,本质就是复读机aaa

AC code:

T2:小可的矛与盾(spearshield)

题目大意:

有n个小可战士站成一排,他们的编号从1到n,每个小可都有一个战斗力xi=i,但是小可们有不同的分工,有的充当队伍的矛,有的充当队伍的盾,矛的攻击力和盾的防御力和小可本身的战斗力相同。我们要将小可们分成两个阵营,编号[1,pos]为第一阵营,第一阵营中我们只考虑矛的攻击力总和w,编号[pos+1,n]为第二阵营,第二阵营中我们只考虑盾的防御力总和v,请问对于所有的pos,|w-v|的值最小,请问|w-v|最小为多少

题目解析:

在一个部队中,有选择矛的,有选择盾的,大意就是在这个队列中,找到一个pos点,如图:

找到一个pos点,只要找对了pos点,使minn=min(矛,盾)那这题就不堪一击了,这题可以用前缀和+后缀和+遍历即可

AC code:

T3:不合法字符串(illegality)

题目大意:

小可是一名小说审核员,他的工作是看小说,然后把小说中不合法字符串和谐掉。
现在给出若干个不合法的字符串 ,和一篇小说 ,小可需要把 中的不合法字符串用 * 和谐掉。当然小可是一个很聪明的审核员,他会用最少的 * 和谐字符串。
比如:
有三个不合法字符串: abc 、 ab 、 a 。 str=abcd
他会只和谐 a ,使得 str=*bcd ,这样小说中就没了不合法字符串。
请输出和谐之后的小说。

题目解析:

①一个容易的写法是将单词按长度排序,之后从短到长在字符串中寻找,并在每次找到后更改最后一位。这个做法有问题!例如单词为 "ab"、"baa" ,字符串为"baab" ,若按 "ab"、"baa" 顺序枚举,则字符串会依此变为"baa*","ba**",共修改2次,实际上只需要修改1次变成"ba*b"即可。
②另一个很直观而且容易想到的写法是枚举字符串每一位,往后从短到长寻找每一个单词是否存在,将找到的最短的单词进行修改。然后这个做法也有问题!例如单词为"asdsa" 、"sds",字符串为"asdsa"时,按此写法在第一位时会先找到"asdsa" ,将其改成"asds*" ,那么在第二位时会"sds"到,导致错误。
③正确的枚举写法是对字符串每一位往前寻找,然后若是找到任意一个以这一位结尾的单词,则更改这一位。
证明如下:改[i]的前提是区间[0,i-1]之间找不到任意一个单词,然后[i]第一次出现单词,不妨设单词为区间[i0,i],同时区间[i,j]也是一个单词,此时改[i]相比改[k](k\epsilon[i0,i-1])是更优的,因为如果改[k]无法保证区间[i,j]里的单词可以被改掉。

AC code:

 

T4:虚假的珂朵莉树(kodori)

题目大意:

在我的后园,可以看见墙外有两株树,一株是枣树,还有一株也是枣树。
某人有一棵树,有 n 个节点,根节点为 1, 每个节点都有一个权值。
设每个节点与根节点距离是这个节点的深度。
小可会在这棵树上增加 m 条虚假边,任意一条虚假边不会和原来的树边或其他虚假边重合(增加的虚假边不影响节点深度)。
之后小可会进行 q 次操作:
操作1: 让结点 u 的权值增加 k ,并对与结点 u 相邻的结点中,深度比结点 k 小的结点重复操作1。 操作2:让结点 u 的权值增加 k ,并对与结点 u 相邻的结点中,深度比结点 u 大的结点重复操作2。
小可想知道,经过 q 次操作之后,所有的节点的权值是多少。

题目解析:

首先,可以发现,我们只需要查询一次,并且每个操作之间无关,那么我们可以在做完所有操作后再进行计算。
其次,若是对同一个点进行多次操作一,可以将这多次操作一合成一次操作一,操作一的权值为多次操作一的权值和,而由其他结点传递过来的操作一也可以和当前结点的操作一进行合并。操作二同理。用两个桶标记数组即可。
对于操作一,可以发现,深度最大的结点不会受到对其他结点进行操作一的影响,那么深度最大的结点操作完后,深度次大的结点就不会再次受到影响。依此类推,我们可以根据结点深度从大到小进行操作一,这样只需要进行一次遍历即可完成所有的操作一操作。
对于操作二,类似于操作一,可以根据结点深度从小到大进行操作。
因此,我们只需要先dfs或bfs处理出各个结点的深度,然后将操作进行记录,在up和down数组中记录操作一和操作二累积的权值,再根据操作按深度从小到大或从大到小进行传递,最后将up、down数组与原本的权值数组进行求和输出即可。
1. 打表每次操作的up增加值、down增加值,并不更新其他相邻的节点。
2. 对于操作一,从深度最大的节点开始往上更新up值。
3. 对于操作二,从深度最小的节点开始往下更新down值。

AC code:

四.考后自我总结

在本场考试中没取得成绩(大悲),不过这题怎么来说也能得点分,报0确实不应该,明天加油!!!

                                                                                                        ------2023.10.3 国庆节 星期二

                                                                                                              祝大家上一个国庆节快乐!
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值