小欧拿到了两个正整数 x 和 y ,她想进行一些操作使得 x 不小于 y ,操作方式是:选择 a 数组中的一个元素 a_i ,将 x 乘以 a_i ,并删掉 a 数组中所有的 a_i 。 小欧想知道,自己最少进行多少次操作,可以使得 x 不小于 y ?
第一行输入两个正整数 x 和 y ,用空格隔开。 第二行输入一个正整数 n ,代表数组大小。 第三行输入 n 个正整数 a_i ,代表数组的元素。 1≤ x,y,a_i ≤ 10^9 1≤ n ≤ 10^5
如果小欧无法在有限的操作下使得 x 不小于 y ,则输出-1。 否则输出一个整数,代表小欧的操作次数。
3 40 4 2 3 4 4
3
2 5 5 2 2 2 2 2
-1
5 5 5 2 2 2 2 2
0
考点:贪心
数据规模 n ≤ 1e5 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:贪心
本题切入点
每次操作会删掉所有等于所选值 a_i 的元素,因此按值从大到小排序,每次取当前最大的值乘上去,直到 x ≥ y。
每一步都取当前最优,靠问题性质保证局部最优能拼成全局最优。
思路框架(贪心 通法 · 非本题专属)
实现要点:贪心题关键在于排序规则:按什么关键字排序决定了策略是否正确。
复杂度:时间 O(n log n)(含排序) | 空间 O(1) ~ O(n)
该范式的通法易错点
对照本题
样例 1:输入 3 40 / 4 / 2 3 4 4 → 输出 3
第一次操作,小欧选择数字3, x 变成9,此时数组为[2,4,4]
第二次操作,小欧选择数字4, x 变成36,此时数组为[2]
第三次操作,小欧选择数字2, x 变成72,此时数组为空。三次操作后 x 不小于 y
操作的方式不是唯一的,但可以证明操作的最小次数为3。
样例 2:输入 2 5 / 5 / 2 2 2 2 2 → 输出 -1
当小欧选择2后, x 变成4,但此时数组为空。因此无法继续操作, x 永远不可能不小于 y 。
样例 3:输入 5 5 / 5 / 2 2 2 2 2 → 输出 0
小欧不需要任何操作。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2023年OPPO秋招算法岗笔试。