C++程序找出击败敌人的最小操作次数


假设,我们正在玩一个电子游戏,游戏主角使用刀来击败敌人。主角可以使用刀来砍杀敌人,或者可以将刀扔向敌人。如果主角扔出一把刀,那么这把刀将无法再次取回。刀i造成的伤害在数组'knives'中给出,其中每个元素的格式为{slash, throw}。'Slash'表示用该刀砍杀敌人造成的伤害,'throw'表示用该刀投掷敌人造成的伤害。砍杀可以无限次进行,但每把刀只能投掷一次。现在,出现了一个生命值为h的敌人。我们需要找出击败敌人所需的最小操作次数(砍杀或投掷)。当敌人的生命值变为0时,敌人就被击败。

因此,如果输入类似于n = 2,h = 11,knives = {{4, 5}, {3, 6}},则输出为2。

如果主角投掷两把刀,则造成的伤害为5 + 6 = 11。敌人的生命值变为0,因此他们被击败。

步骤

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

val := 0
for initialize i := 0, when i < n, update (increase i by 1), do:
   val := maximum of (val and first value of knives[i])
sort the array knives
res := 0
for initialize i := 0, when i < n, update (increase i by 1), do:
   if second value of knives[i] > val, then:
      h := h - second value of knives[i]
      (increase res by 1)
      if h <= 0, then:
         print(res)
   exit
      Otherwise
Come out from the loop
print((res + ceiling value of (h / (double))))

示例

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

#include <bits/stdc++.h>
using namespace std;

void solve(int n, int h, vector<pair<int, int>> knives){
   int val = 0;
   for(int i = 0; i < n; i++){
      val = max(val, knives[i].first);
   }
   sort(knives.begin(), knives.end());
   int res = 0;
   for(int i = 0; i < n; i++){
      if(knives[i].second > val){
         h -= knives[i].second;
         res++;
         if(h <= 0){
            cout << res << endl;
            return;
         }
      }
      else break;
   }
   cout << (res + ceil(h / (double)val)) << endl;
}
int main() {
   int n = 2, h = 11;
   vector<pair<int, int>> knives = {{4, 5}, {3, 6}};
   solve(n, h, knives);
   return 0;
}

输入

2, 11, {{4, 5}, {3, 6}}

输出

2

更新于: 2022年3月2日

334 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告