力扣3273.对Bob造成的最少伤害
-
贪心
- 考虑每个敌人对答案的贡献
- 对于敌人AB:先杀A所受伤害为t~A~ * d~A~ + (t~A~ + t~B~) * d~B~
- 先杀B所受伤害为t~B~ * d~B~ + (t~A~ + t~B~) * d~A~
- 因此如果t~A~ * d~B~ < t~B~ * d~A~
- 就先杀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;
}
};