秋招模拟赛第29场|携程实习|2023.05.25
- Status
- Done
- Rule
- IOI
- Problem
- 3
- Start at
- 2023-6-19 19:00
- End at
- 2023-6-19 20:30
- Duration
- 1.5 hour(s)
- Host
- Partic.
- 11
You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.
小红和朋友到郊外玩耍,偶然间,他获得n棵长度随机的竹子,他每次都会进行如下操作:·选择一棵正数高度的竹子,砍去二分之一的长度(结果向下取整)。请你帮小红计算一下,他最少多少次操作可以使得所有竹子长度相等?
输入第—行为一个正整数n,代表共有 n 棵竹子。 输入第二行为 n 个正整数ai,代表第 i 棵竹子的长度。
1 ≤ n ≤ 100000 ,1 ≤ ai ≤ 109
—个整数,代表最少的操作次数。
输入
4
1 2 3 4
输出
4
输入
1
1024
输出
0
首先观察一下数据范围,n≤105,1≤ai≤109,我们知道232>109,因此对一个数字至多操作32次,就可以将其变为1,因此,我们总共的操作次数最坏情况也不会超过32n,因此我们可以直接模拟整个过程。
贪心地考虑:我们最终只需要保证这n个数字的最大值和最小值相等,即可保证所有的数字都相等,那么我们一定是优先操作最大数,我们可以使用大根堆去维护所有的竹子,每次将大根堆的堆顶元素(最大值)弹出,然后将其/2,然后在定义一个变量minv动态维护竹子的最小值,当大根堆的堆顶元素的值与minv相等时,则说明已经满足题目要求,直接输出操作次数即可。