博客主页:Skylar Lin
望本文能够给您带来一定的帮助,如果有错误的地方敬请斧正!
新人博主🧑,希望多多支持🍺,还有好多库存和大家分享🎁。
转载需注明出处和原作🌹。
消灭怪物的最大数量
你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个 下标从 0 开始 且长度为n
的整数数组dist
,其中dist[i]
是第i
个怪物与城市的 初始距离(单位:米)。
怪物以 恒定 的速度走向城市。给你一个长度为n
的整数数组speed
表示每个怪物的速度,其中speed[i]
是第i
个怪物的速度(单位:米/分)。
怪物从 第 0 分钟 时开始移动。你有一把武器,并可以 选择 在每一分钟的开始时使用,包括第 0 分钟。但是你无法在一分钟的中间使用武器。这种武器威力惊人,一次可以消灭任一还活着的怪物。
一旦任一怪物到达城市,你就输掉了这场游戏。如果某个怪物 恰 在某一分钟开始时到达城市,这会被视为 输掉 游戏,在你可以使用武器之前,游戏就会结束。
返回在你输掉游戏前可以消灭的怪物的 最大 数量。如果你可以在所有怪物到达城市前将它们全部消灭,返回n
。
题解
首先计算每个怪物到达城市的时间,并将这些时间升序排序。
然后,检查每个时间点是否有怪物到达城市,如果有,就返回该时间点的索引,即:在该时间点我们输掉了游戏,同时消灭了与时间点数量相同的怪兽。
如果没有怪物在 n 分钟内到达城市,就返回 n,表示在游戏结束前我们消灭了所有怪物。
class Solution {
public:
int eliminateMaximum(vector<int>& dist, vector<int>& speed) {
int n = dist.size();
std::vector<int> arrivalTimes(n);
for (int i = 0; i < n; ++i) {
// 计算每个怪物到达城市的时间(向上取整)
arrivalTimes[i] = (dist[i] + speed[i] - 1) / speed[i];
}
std::sort(arrivalTimes.begin(), arrivalTimes.end()); // 按到达时间升序排序
for (int i = 0; i < n; ++i) {
if (arrivalTimes[i] <= i) {
return i; // 第 i 分钟内有怪物到达城市,返回 i(0-based)
}
}
return n; // 没有怪物在 n 分钟内到达城市,返回 n
}
};