A、
题意:给你一串字符串(<=100),将ogo ogogo ogogogo ogogogogo……这种全部缩成***,输出缩后的字符串
分析:第一遍扫对于那些go的位置,记录下next[i]表示最远能扩展到的位置,第二遍扫只要看o即可,如果o后面的位置next存在,那么说明这一段全部缩为***,跳到next[i+1]+1继续下一段操作
B、= =
C、
题意:你将从0点开车到s点,路上有一些加油站,加油时间忽略不计。你有两种开车选择,一种是每km走1min,花费2L油,另一种是每km走2min,花费1L油。你有n种汽车可以选择,给出它们的油箱容量(刚开始满的)和价格,能否选择一辆价格最低的车,能在时间t内跑完全程?如果不能输出-1
分析:首先想到对所有汽车升序排序,对于那些容量小,价格高的车我们忽略,最后得到的汽车数组肯定两个属性都是升序的。
明显这个是满足单调性的,所以可以二分枚举选择哪辆车,然后就是判定的问题。
判定的时候注意每一段可以高速和低速交替,但都是对整数路段操作的,所以贪心着来,先把低速填满,然后根据剩余油量填高速,计算时间并判断是否合法。
O(klogn)
D、
题意:有长度为n的格子,有a个长度为b的船安放在其中,但是你看不见它们。每次操作可以射击一个格子,获取这个格子的信息(船的一部分?或者是空的?),给你已经射击的k个格子,问最多还需射击多少次才能射到船的一部分,并输出射击方案。
分析:先看所有连续的0的一段,假设船有无穷多个,统计需要射击的个数(即每b-1个0射一次),记为s,那么现在的问题就是s个可疑位置中有a个可能的船,那么我们只需要把剩下的s-a个位置封死即可。
E、
题意: 给出n个点,和它们的深度(深度有可能是错的),指定节点s为根节点(根节点的深度也有可能是错的,即输入的深度不是0), 求最少更改多少个点的深度可以使得其合法,n<=2e5
分析:合法的当且仅当深度是[0..len]每个数字全都有,且0只有一个。
将它们按照深度从小到大排序,枚举每一个i,将这个点作为最底层的点,将后面的点放到前面去(当然还有那些多余的0),计算操作数(当然要和前面断层的数量比较,如果数量不足则无法作为可能的结果),这样枚举一边就可以得到结果。
注意数据给你的s也有可能深度不是0,根据题意,这个点一定是根节点,所以只要把它改为0,操作数额外加1即可,不需要考虑更多复杂的东西……