算法竞赛
🧠Codeforces Round 855 (Div. 3)总结
00 分钟
2023-4-30
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛

A

让我们求字符串中的字符是否是按照 m e o w 的顺序严格出现的。
对四个字符进行依次的模拟,遍历到这四个字符,则依次寻找指针在字符串中对应的位置,如果此位置没有出现此字符或者最后存在多的字符则终止输出no
也可以使用unique+erase的方式,这样的话,如果满足条件,则字符串中一定只剩这四个字符,则比较是否一致即可。

B

给你一个大小写混合的字符串,如果一个字母同时存在一个大写和小写和他们两个位置可以配成一对,你可以进行k次操作,每次都可以改变一个字母的大小写,则最多会存在多少个配对呢?
例如:
  • a:4
  • A:2
则配对的数量为 2,然后还剩下两个小写的a,我们就可以对其中一个小a进行一次操作,即转换为一个大写A,则这样我们得到的配对数量为3,进行了k=1次操作。相当于每进行一次k操作,都会产生一个新的配对。
因此我们分别对正常配对下和操作后配对进行统计:
  • 正常配对的数量:num+=min(cnt[’A’],cnt[’a’])
  • 操作后新产生的配对的数量:opt+=abs(cnt[’A’]-cnt[’a’])/2 (注意此时的cnt的数量要减去num)
因为我们不能超过k次操作,因此最后取一个:ans+=min(k, opt)
当然也可以直接统计全部的配对数量,然后在ans+k和mx中取一个最小值即可。

C2

英雄牌:0
奖励牌:任意的正数
你需要在牌桌上按顺序拿牌,如果拿到的是英雄牌,则选择所有奖励牌的顶部的一张牌,并且计算战力;如果你拿到的是奖励牌,则你可以把这张牌放到奖励牌的顶部或者丢弃它。

很显然这是一个的模型。
如果是奖励牌,则入栈,如果是英雄牌,则栈顶出栈,计算最后得到的最大战力值和。
对于每一次抽到英雄卡,则选择的栈值顶一定是越大越好,因此我们直接使用优先队列的大根堆来维护,栈顶一定是最大值。

D

给你一个字符串,可以去除两个相邻的字母,则去除后能存在多少种不同的字符串,输出数量。
如果我们老老实实的去除字符串,则最后的时间复杂度是O(N^2)的,一定会超时。
但是我们没有必要去除字符串,考虑下面的情况:
ylh010p 下标从1开始。
  • 去除第4和第5个字符的时候:组成 ylh0p
  • 去除第5和第6个字符的时候:组成 ylh0p
我们第一次去除了 01 ,第二次去除了 10 但是他们的结果是一样的,并且我们发现:第4个字符等于第6个字符,不妨假设出现这种情况的时候,两次改变算一种情况
因此我们直接遍历一遍,初始的不同的字符串的数量为 ans = n-1让 ans 减去出现这种情况的次数即可。

E2

题目描述:给你两个字符串s和t,能否通过 往左或者往右 移动等于 k 或者 k+1 个距离的时候,交换两个位置的字符来得到 目标字符串 t ?
例如一个字符串是 :aaab,我们的目标字符串是 baaa,则让第一个字符串的第一个字母往右移动 k=3的距离,然后交换这两个位置的字符,然后我们便得到了 baaa目标字符串。

我们既然可以往左或者往右任意的移动k或者k+1个距离,不妨假设 k=3,则它可以往右移动4和3,也可以往左移动4和3。
如果往移动了 4 个距离,然后到达一个新位置之后,交换字符;然后再往移动 3 个距离,到达了起始位置的往右一个位子,交换字符,这样便实现了往右仅仅移动了一个位置
同理也可以实现往左移动一个位置,同理在这个新的位置再次重复可以实现往任何方向的位置移动,因此一个字符在可以移动的情况下可以到达任何位置!
但是需要满足一个前提:可以往左和往右任意移动,即不会越界
然后我们统计其他位置的字符的出现次数是否与目标字符串的字符出现次数是否一致就好了。
 

评论
  • Twikoo
  • Valine