小欧的选数乘积 | 贪心 Set Go
小欧的选数乘积
https://www.nowcoder.com/practice/a94f523ebe424d0481533dc9e6138724
题意
小欧拿到了两个正整数x和y,她想进行一些操作使得x不小于y,操作方式是:选择a数组中的一个元素ai,将x乘以ai,并删掉a数组中所有的ai。
小欧想知道,自己最少进行多少次操作,可以使得x不小于y?
思路
根据题意,数组里的每个元素只能用一次,所以需要对数组进行去重,这里直接输入的时候加了个哈希表维护了。
贪心地考虑,需要操作次数最少,那每次乘的元素肯定要尽量的大,这样一次操作产生的贡献才多,所以数组排序后,从大到小进行遍历,如果x>=y就跳出循环。最后记得判断一下x和y的关系,以判断-1的情况
Go代码
package main import ( "fmt" "sort" ) func main() { var x, y, n, val int fmt.Scan(&x, &y, &n) a := make([]int, 0, n) mp := make(map[int]struct{}, n) for i := 1; i <= n; i++ { fmt.Scan(&val) if _, ok := mp[val]; ok { continue } mp[val] = struct{}{} a = append(a, val) } sort.Ints(a) cnt := 0 for i := len(a) - 1; i >= 0; i-- { if x >= y { break } x *= a[i] cnt++ } if x < y { cnt = -1 } fmt.Println(cnt) }#牛客创作赏金赛#
15天大厂真题带刷Go题解 文章被收录于专栏
15天大厂真题带刷Golang题解