力扣3273.对Bob造成的最少伤害
-
贪心
- 考虑每个敌人对答案的贡献
- 对于敌人AB:先杀A所受伤害为tA * dA + (tA + tB) * dB
- 先杀B所受伤害为tB * dB + (tA + tB) * dA
- 因此如果tA * dB < tB * dA
- 就先杀A
cpp
class Solution {
public:
long long minDamage(int power, vector<int>& damage, vector<int>& health) {
int n = health.size();
vector<pair<int,int>> a(n);
for(int i=0;i<n;i++)
a[i] = {(health[i] - 1) / power + 1,damage[i]};
//按照公式排序
ranges::sort(a,[](const auto &p,const auto &q){
return p.first * q.second < q.first *p.second;
});
//s记录累积时间
long long ans = 0,s = 0;
//对于每个敌人的贡献 = 存活天数 * 伤害
for(auto &[k,d] : a)
{
s += k;
ans += s * d;
}
return ans;
}
};