首页 文章资讯内容详情

C ++中的超级鸡蛋滴

2026-06-05 1 花语

假设我们给了K个鸡蛋,并且我们有一个N层从1到N的建筑物。现在每个鸡蛋的功能是相同的,并且如果一个鸡蛋破裂了,我们就不能再次丢弃它。

存在一个介于0到N之间的F层,这样,落在F层以上的任何鸡蛋都不会破裂,而落在F层以下或F层以下的任何鸡蛋都不会破裂。在每一步中,我们可能会拿一个鸡蛋并将其从任意楼层X放下。X的范围是1到N。

我们的目标是确定F的值。那么,无论F的初始值如何,我们需要确定地知道F是多少的最小移动次数是多少?

因此,如果输入为K=2且N=6,则输出为3。

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

定义一个2D数组dp

定义一个函数solve(),它将取K,N,

如果N<=1,则-

返回N

如果K等于1,则-

返回N

如果dp[K,N]不等于-1,则-

返回dp[K,N]

ret:=N,低:=0,高:=N

低:=中+1

从循环中出来

当低<=高时,执行-

左:=1+求解(K-1,中-1)

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

ret:=ret的最小值和left和right的最大值

如果左与右相同,则-

如果左<右,则:

否则高:=中-1

返回dp[K,N]=ret

Frm主要方法执行以下操作-

dp:=创建一个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