题意

小欧拿到了两个正整数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)
}