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")
浙公网安备 33010602011771号