C ++程序找到放置炸弹以杀死所有怪物的最少位置

假设我们有两个数组 X 和 H。两者都有 N 个元素,还有另外两个数字 D 和 A。考虑在一个故事中,一只银狐正在与 N 个怪物战斗。怪物排成一排,第 i 个怪物的坐标是 X[i],它的生命值是 H[i]。银狐可以使用炸弹攻击怪物。在x位置投掷炸弹会对x-D到x+D范围内的所有怪物造成伤害。它们的生命值会减少A。当所有怪物的生命值都为0时,狐狸获胜。我们必须找到获胜所需的最低限度。

所以,如果输入像 D = 3; A = 2; X = [1, 5, 9]; H = [2, 4, 2],那么输出会是2,因为第一个炸弹在坐标4,新的生命值是[0, 2, 2],然后在位置6使所有生命值[0, 0, 0]。

脚步

为了解决这个问题,我们将遵循以下步骤 -

Define a large array q

Define an array of x and h pairs

n := size of X

d := D

a := A

for initialize i := 1, when i <= n, update (increase i by 1), do:

   num[i].x := X[i - 1]

   num[i].h := H[i - 1]

sort the array num

sum := 0

for initialize i := 1, when i <= n, update (increase i by 1), do:

   q[i] := q[i] + q[i - 1]

   num[i].h := num[i].h - q[i] * a

   if num[i].h <= 0, then:

      Ignore following part, skip to the next iteration

   p := (if num[i].h mod a is same as 0, then num[i].h / a, otherwise num[i].h / a + 1)

   tmp := num[i].x + 2 * d

   sum := sum + p

   q[i] := q[i] + p

   l := i, r = n

   while l < r, do:

      mid := (l + r + 1) / 2

      if num[mid].x <= tmp, then:

         l := mid

      Otherwise

         r := mid - 1

      q[l + 1] - = p

return sum

示例

让我们看看以下实现以更好地理解 -

#include <bits/stdc++.h>

using namespace std;

const int maxn = 2e5 + 20;

int n;

int d, a, q[maxn];

struct node{

   int x, h;

   bool operator<(const node& a) const{

      return x < a.x;

   }

} num[maxn];

int solve(int D, int A, vector<int> X, vector<int> H){

   n = X.size();

   d = D;

   a = A;

   for (int i = 1; i <= n; i++){

      num[i].x = X[i - 1];

      num[i].h = H[i - 1];

   }

   sort(num + 1, num + n + 1);

   int sum = 0;

   for (int i = 1; i <= n; i++){

      q[i] += q[i - 1];

      num[i].h -= q[i] * a;

      if (num[i].h <= 0)

         continue;

      int p = (num[i].h % a == 0 ? num[i].h / a : num[i].h / a + 1);

      int tmp = num[i].x + 2 * d;

      sum += p;

      q[i] += p;

      int l = i, r = n;

      while (l < r){

         int mid = (l + r + 1) >> 1;

         if (num[mid].x <= tmp)

            l = mid;

         else

            r = mid - 1;

      }

      q[l + 1] -= p;

   }

   return sum;

}

int main(){

   int D = 3;

   int A = 2;

   vector<int> X = { 1, 5, 9 };

   vector<int> H = { 2, 4, 2 };

   cout << solve(D, A, X, H) << endl;

}

输入

3, 2, { 1, 5, 9 }, { 2, 4, 2 }
输出结果
2

以上是 C ++程序找到放置炸弹以杀死所有怪物的最少位置 的全部内容, 来源链接: utcz.com/z/297230.html

回到顶部