每次测试时间限制:1 秒
内存限制:256 兆字节
题目描述
在回收中心有 n 个垃圾袋,第 i 个袋子的重量为 ai。
每一秒,会按顺序发生两个动作:
- 你必须选择一个垃圾袋并将其销毁。
- 如果该垃圾袋的重量 严格大于 c,则花费 1 枚硬币;
- 否则花费 0 枚硬币。
- 然后,剩余每个垃圾袋的重量都会乘以 2。
问:销毁所有垃圾袋所需的最小硬币数是多少?
输入
每个测试点包含多个测试用例。第一行包含一个整数 t(1≤t≤1000)——测试用例的数量。
每个测试用例的第一行包含两个整数 n 和 c(1≤n≤30,1≤c≤109)。
第二行包含 n 个整数 a1,a2,…,an(1≤ai≤109)——每个垃圾袋的重量。
输出
对于每个测试用例,输出一个整数——销毁所有垃圾袋所需的最小硬币数。
示例
输入
4
5 10
10 4 15 1 8
3 42
1000000000 1000000000 1000000000
10 30
29 25 2 12 15 42 14 6 16 9
10 1000000
1 1 1 1 1 1 1 1 1 864026633
输出
2
3
6
1
注释
下文中:
- 蓝色数字表示免费销毁的垃圾袋,
- 红色数字表示花费 1 硬币销毁的垃圾袋,
- 黑色数字表示尚未销毁的垃圾袋。
在第一个测试用例中,一种方案如下:
初始:[10,4,15,1,8]
第 1 秒:销毁 10(免费,因为 10≤10),剩余袋子乘以 2 → [10,8,30,2,16]
第 2 秒:销毁 8(免费,因为 8≤10),剩余乘以 2 → [10,8,60,4,32]
第 3 秒:销毁 32(花费 1,因为 32>10),剩余乘以 2 → [10,8,120,8,32]
第 4 秒:销毁 8(免费,8≤10),剩余乘以 2 → [10,8,240,8,32]
第 5 秒:销毁 240(花费 1,240>10)
总共花费 2 枚硬币,可以证明这是最优的。
在第二个测试用例中,一种方案:
初始:[109,109,109]
第 1 秒:销毁 109(花费 1,因为 109>42),剩余乘以 2 → [109,2×109,2×109]
第 2 秒:销毁 2×109(花费 1,2×109>42),剩余乘以 2 → [109,2×109,4×109]
第 3 秒:销毁 4×109(花费 1,4×109>42)
总共花费 3 枚硬币。