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

C++でのスーパーエッグドロップ


K個の卵を与え、1からNまでのN階の建物があるとします。これで、各卵の機能は同じになり、卵が壊れた場合、再び落とすことはできません。

Fより高い階に落とされた卵は壊れず、F階以下に落とされた卵は壊れないように、0からNの間のF階が存在します。それぞれの動きで、私たちは卵を取り、それを任意のフロアXから落とすことができます。Xは1からNの範囲にあります。

私たちの目標は、Fの値が何であるかを確実に知ることです。では、Fの初期値に関係なく、Fが何であるかを確実に知る必要がある最小移動数はいくつになるでしょうか?

したがって、入力がK=2およびN=6のような場合、出力は3になります。

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

  • 1つの2D配列dpを定義します

  • 関数solve()を定義します。これには、K、N、

    が必要です。
  • N <=1の場合、-

    • Nを返す

  • Kが1と同じ場合、-

    • Nを返す

  • dp [K、N]が-1に等しくない場合、-

    • dp [K、N]

      を返します
  • ret:=N、low:=0、high:=N

    • 低い<=高い間、実行-

    • 左:=1 +solve(K-1、mid-1)

    • 右:=1 + Solve(K、N-mid)

    • ret:=retの最小値と左右の最大値

    • 左が右と同じ場合、-

      • ループから出てきます

    • 左<右の場合:

      • 低:=中+ 1

    • それ以外の場合は高い:=中程度-1

  • dp [K、N] =ret

    を返します
  • 主な方法を確認するには、次のようにします-

  • dp:=1つの2D配列(K + 1)x(N + 1)を作成し、これに-1を入力します

  • リターンソルブ(K、N)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   vector<vector<int>> dp;
   int solve(int K, int N) {
      if (N <= 1)
         return N;
      if (K == 1)
         return N;
      if (dp[K][N] != -1)
         return dp[K][N];
      int ret = N;
      int low = 0;
      int high = N;
      while (low <= high) {
         int mid = low + (high - low) / 2;
         int left = 1 + solve(K - 1, mid - 1);
         int right = 1 + solve(K, N - mid);
         ret = min(ret, max(left, right));
         if (left == right)
         break;
         if (left < right) {
            low = mid + 1;
         } else
            high = mid - 1;
      }
      return dp[K][N] = ret;
   }
   int superEggDrop(int K, int N) {
      dp = vector<vector<int>>(K + 1, vector<int>(N + 1, -1));
      return solve(K, N);
   }
};
main(){
   Solution ob;
   cout << (ob.superEggDrop(2,6));
}

入力

2, 6

出力

3

  1. C++列挙型

    C ++列挙型の使用方法:ガイド 列挙型は、値の範囲から1つの値を割り当てることができるユーザー定義のデータ型です。 列挙型は、変数が特定の値のセットから1つの値のみを格納できるようにする必要がある場合に、プログラミングでよく使用されます。たとえば、曜日のみを格納する変数が必要な場合は、列挙型を使用できます。 このチュートリアルでは、例を参照して、C ++での列挙の基本、列挙を定義する方法、およびコードで列挙を使用する方法について説明します。このチュートリアルを読み終えると、C++で列挙型を使用するエキスパートになります。 C++列挙型 列挙型は、列挙型とも呼ばれ、可能な値の範囲が固

  2. グラフ内のスーパー頂点を見つけるためのC++プログラム

    n個の頂点を持つグラフが与えられたとします。頂点には1からnの番号が付けられ、配列edgesで指定されたエッジによって接続されます。各頂点には、配列valuesで指定された1からnまでの数値内のx値があります。ここで、グラフからスーパー頂点を見つける必要があります。頂点1からiへの最短経路にi番目の頂点と同じ「x」値を持つ頂点がない場合、頂点iは「スーパー頂点」と呼ばれます。この基準を満たすすべての頂点を印刷します。 したがって、入力がn =5のようである場合、値={1、2、2、1、3}、エッジ={{1、2}、{2、3}、{2、3}、{2、4 }、{4、5}}の場合、出力は1 345に