C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

敵を殺すための武器で最小の動きを見つけるためのC++コード


n個の要素を持つ配列Aがあり、別の数Hがあるとします。Hは敵の体力です。n個の武器があり、i番目の武器のダメージ力はA[i]です。さまざまな武器を使用して敵を殺すことができます。同じ武器を2回続けて使用することはできません。敵を殺すために武器を使用できる最小回数を数える必要があります。

したがって、入力がA =[2、1、7]のような場合; H =11の場合、出力は3になります。これは、ダメージパワーが7の武器を使用する場合、2を使用し、次に7を使用すると、敵を倒すことができるためです。

ステップ

これを解決するには、次の手順に従います-

sort the array A
n := size of A
x := (A[n - 1] + A[n - 2])
return H / x * 2 + (H mod x + A[n - 1] - 1) / A[n-1]

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> A, int H){
   sort(A.begin(), A.end());
   int n = A.size();
   int x = (A[n - 1] + A[n - 2]);
   return H / x * 2 + (H % x + A[n - 1] - 1) / A[n - 1];
}
int main(){
   vector<int> A = { 2, 1, 7 };
   int H = 11;
   cout << solve(A, H) << endl;
}

入力

{ 2, 1, 7 }, 11

出力

3

  1. C++での最小の騎士の動き

    座標が-無限大から+無限大までの無限のチェス盤があり、正方形[0、0]に騎士がいるとします。騎士は、以下に示すように、8つの可能な動きをすることができます。それぞれの動きは、基本方向に2マス、次に直交方向に1マスです。 騎士を正方形[x、y]に移動するために必要な最小ステップ数を見つける必要があります。答えが存在することが保証されています。 したがって、入力がx=5およびy=5の場合、出力は4になります。これは[0,0]→[2,1]→[4,2]→[3,4]→[のようになります。 5,5] これを解決するには、次の手順に従います- マップを定義するm Solve()とい

  2. C++の二分探索木で最小値のノードを見つけます

    1つの二分探索木があるとします。二分探索木で最小要素を見つける必要があります。したがって、BSTが以下のような場合- 最小要素は1になります。 左のサブツリーは常に小さい要素を保持していることがわかっています。したがって、左がnullになるまで左のサブツリーを何度もトラバースすると、最小の要素を見つけることができます。 例 #include<iostream> using namespace std; class node{    public:       node *left;