小欧的选数乘积 | 贪心 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题解


查看13道真题和解析