Codeforces Round 878 (Div. 3)
比赛链接:https://codeforces.com/contest/1840
A. Cipher Shifer
题意:给你一个加密后的字符串,加密规则是将原字符串每个字符连续写两次,并在其中添加任意长度大于等于零的子串,求解原字符串
思路:不用管添加的子串,从第一个字符开始找每出现两次的字符就是原字符串的
B. Binary Cafe
题意:有n块钱,k种甜品,编号0 ~ k-1,编号i的甜品价格为2^i,问买甜品的组合是多少种(不买也算一种)
思路一:其实选不选某个甜品就是这个二进制位是否为1,如果n的二进制位数大于k,显然,对于每一个价格小于n的甜品,我们都有买或不买(即0/1)的选择,所以有 2^k 种可能;否则,显然我们需要找到所有和比n小的组合,对于第i位,如果这一位是1,那么我们有两种选择,要么让这一位仍然是1,种类数和前一位相等,或者让这一位是0,就有 2^(i-1) 种可能性,如果这一位是0,不存在可能性,和前一位相等,于是就有一个dp式
f[i] = f[i - 1]; (n & 1 == 1)
f[i] = (1 << (i - 1)) + f[i - 1]; (n & 1 == 0)
思路二:其实就是求小于等于n的数有多少个,管他什么二进制,要是 2^k 不如n大,就是 2^k 种,否则就是n+1种
C. Ski Resort
题意:给出n天的温度,问有多少长度至少为k的连续子区间满足每天温度低于q
思路:用双指针找每个长度尽可能长的连续子区间,如果长度大于等于k,有
m = (r - l) - (k - 1);
ans += m * (m + 1) / 2;
D. Wooden Toy Festival
题意:有1e9种木偶,有n个订单3个木匠做,每个木匠事先选一种模板x,每个木匠负责一部分,每个木偶花费的时间是|x-ai|,每个木匠可以同时制作各自负责的人偶,问所有工匠完成的最短时间
思路:实际上,一个工匠的完成时间只和一个人偶有关,我们假设x是某个工匠用时,那么这个工匠的工作种类跨度不超过2 * x,我们按照这个原则来二分三个工匠中最长的用时,如过能分出的跨度数大于等于三,说明跨度太小从右边找,否则从左边找
E. Character Blocking
题意:给两个字符串,每秒有如下三种操作:1.排除某位的字符并在固定t秒后恢复;2.交换某两位的字符;3.询问除排除的字符外两字符串是否相等
TLE思路:记录每位排除的时间,如果查询时已隔t秒,视为恢复,逐位比较
AC思路:diff记录两字符串不同的个数,每次操作都要维护diff,询问就降到了O(1)
F. Railguns
题意:从(0, 0)走到(n, m),每秒可以往下或往右或不动,在某些时间某些行/列会有轨道炮轰击,问最短时间,如果走不到输出-1
MLE兼TLE思路:bfs,如果这一秒有炮,看看目前的位置和下一个位置是否有炮击
AC思路:我们能发现,如果不是一直傻傻不动,我们的最长用时是n + m + shotTimes(炮击轮数),我们用alive[i][j][k]记录在(i, j)等待了k次后是否被炮打死,读入炮击信息后初始化alive,dp[i][j][k]含义相同,推导式为dp[i][j][k] = dp[i - 1][j][k] | dp[i][j - 1][k] | dp[i][j][k - 1]
最后只需要找到最小的i + j + k令dp[i][j][k] = true即可
G略