---
title: "Educational Codeforces Round 125 (Div. 2) D(枚舉+貪心+二分)"
tags: 題解, 枚舉, 貪心, 二分
---
https://codeforces.com/contest/1657/problem/D
#### 題意
有 $n$ 種軍隊,第 $i$ 種軍隊的單位成本為 $c_i$,傷害為 $d_i$,生命值為 $h_i$。
有 $m$ 隻怪物,第 $j$ 隻怪物的傷害為 $D_j$,生命值為 $H_j$。
組成軍隊的方式是選擇**一種**軍隊並招募一些 (假設為 $k$)單位,成本為 $k*c$,傷害為 $d*c$,生命值仍為 $h$。與第 $j$ 隻怪物戰鬥時,需在比怪物更短的時間殺掉怪物。成本不能大於 $C$。
問:對於每種怪物,最少需要多少成本才能戰勝,若不能戰勝則為 $-1$。
#### 思路
對於第 $i$ 種軍隊,要戰勝第 $j$ 種怪物須滿足:
$\frac{H_j}{d_i*k}<\frac{h_i}{D_j}$
可以看出我們只在乎 $d_ih_ik$ 的大小,因此我們可以針對不同成本 $c$,試著用不同種軍隊構造出最大的 $DH[c]$。對於成本 $c_2$,當 $c_1$ 可整除 $c_2$ 時($c_2=c_1*k$),可以用 $DH[c] * k$ 去更新 $DH[c_2]$。
由於成本越大,能構造出的 $DH[c]$ 也會越大,對於怪物 $d_jh_j$,可以用二分搜索找出大於 $d_jh_j$ 中最小成本的方案,若找不到則為不可能戰勝。
#### Code
```python=1
def solve():
n, C = map(int, input().split())
DH = [0 for _ in range(C + 1)]
for _ in range(n):
c, d, h = map(int, input().split())
DH[c] = max(DH[c], d * h)
for c in range(1, C + 1):
DH[c] = max(DH[c], DH[c - 1])
for c2 in range(c, C + 1, c):
DH[c2] = max(DH[c2], DH[c] * (c2 // c))
m = int(input())
ans = []
for _ in range(m):
d, h = map(int, input().split())
pos = bisect_right(DH, d * h)
ans.append(pos if pos < len(DH) else -1)
print(*ans)
if __name__ == "__main__":
solve()
```