T1:非力なレッド

勇者 \(taiga\) 正尝试打倒 \(N\) 只怪物。\(taiga\) 的战斗力为 \(X\),生命值为 \(M\)。怪物 \(i\) 的战斗力为 \(A_i\)\(taiga\) 在和怪物战斗前可以使用以下魔法任意次:

  • 选择一个满足 \(1 \leqslant k \leqslant \min(N, M)\) 的整数 \(k\),对所有满足 \(1 \leqslant i \leqslant k\) 的整数 \(i\),将 \(A_i\) 替换成 \(\lfloor\frac{A_i}{2}\rfloor\),然后将 \(M\) 替换成 \(M-k\)

\(taiga\) 在战斗时,只有当 \(X > \max\limits_{1 \leqslant i \leqslant N} A_i\) 时才能打到所有怪兽,否则 \(taiga\) 连一只怪物都打不倒就输了。
\(taiga\) 可否在战斗前正确使用魔法打败所有怪物。

限制:

  • \(1 \leqslant N \leqslant 2 \times 10^5\)
  • \(1 \leqslant X \leqslant 10^9\)
  • \(0 \leqslant M \leqslant 10^9\)
  • \(1 \leqslant A_i \leqslant 10^9\)

算法分析

可以考虑贪心:从后往前对所有满足 \(A_k \geqslant X\)\(k\) 使用 \(t\) 次魔法,同时更新 \(M\) 的值

其中 \(t\) 表示可以令 \(\lfloor\frac{A_i}{2^t}\rfloor < X\) 的最小整数

最后判断 \(M\) 是否是非负数即可

代码实现
n, x, m = map(int, input().split())
a = list(map(int, input().split()))
for i in range(n-1, -1, -1):
    while a[i] >= x:
        for j in range(i+1):
            a[j] /= 2
        m -= i+1
if m >= 0:
    print("Yes")
else:
    print("No")