二分+思维

简单

L - Candy Machine

传送门
题意:给定一个 n 和 n 个数,任取任意个元素形成一个集合,问集合中数值严格大于集合平均值的数量最大是多少(n <= 1e5)
做法:为使数量尽可能的多,那么集合平均值越小越好,所以小的数优先进入集合。①排序;②枚举每个元素,令前 i 个数进入集合,对 1 ~ i 个求平均值,用二分找大于均值的第一个数的位置,即可知大于均值的数值的数量,取max即可

K - Video Reviews

传送门
题意:给定 n 和长度为 n 的数组 a,编号 1 ~ n,每个数的意义是如果前面有 <= a[i] 个数提供了贡献,那么这个数也会提供贡献,否则不提供贡献。你有一种操作可以令 a[i] = 0,问:如果至少需要 m 个数提供贡献,问最少操作次数
做法:越早使用操作次数对后面的数影响越大,越可能让得到的贡献越大,那么加入给定 x 个操作数,对数组从前往后扫,能用就用,这样得到的贡献一定是最大的。所以本题是经典的二分答案模拟过程,所以采用二分,左右区间初始为 [0 , n],枚举操作的次数,得到的贡献 >= m,修改 r,否则修改 l

L - Queries on a String

传送门
题意:给定一个长度为 n 字符串 a,对一个空字符串用 m 次操作,操作分为两种:
1、往字符串末尾添加一个字符
2、从字符串末尾删除一个字符(保证空字符串不会出现该操作)
每次操作都询问这个字符串是否为 a 的子序列,是的话输出YES,否则输出NO
做法:对于一个是 a 子序列的字符串 b,在 b 后面添加一个字符,如果这个字符在 a 中出现的位置比 b 最后一个字符在 a 中出现的位置大,那么添加字符后的 b 依然是 a 的字符串。
我们用栈维护这个字符串,栈存的是这个字符在 a 中出现的位置,这个位置必须比他下面的元素大,也就是说,这个栈是从栈头到栈底是严格递减的,如果找不到合法的位置,意味着这个字符串不是 a 的子序列,就进栈一个 -1,一旦一个是 -1,其他字符入栈时也都是-1,只要中间有一个不符合子序列,后面再怎么添加都不是子序列,那么答案很好判断,操作完后判断栈头是否为 -1 即可。
那么现在的问题是如何从字符在 a 中出现的所有位置里找到一个合法的位置,在 a 中所有出现位置中找到一个大于 x 的最小位置,显然是二分。
所以整理一下就是:
push 的时候对字符用二分找,找得到就把找到的结果存进栈里,找不到就存-1,判断栈头是否为 -1,是的话输出NO,反之输出YES

中等

较难

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值