1884. 鸡蛋掉落-两枚鸡蛋
给你 2
枚相同 的鸡蛋,和一栋从第 1
层到第 n
层共有 n
层楼的建筑。
已知存在楼层 f
,满足 0 <= f <= n
,任何从 高于 f
的楼层落下的鸡蛋都 会碎 ,从 f
楼层或比它低 的楼层落下的鸡蛋都 不会碎 。
每次操作,你可以取一枚 没有碎 的鸡蛋并把它从任一楼层 x
扔下(满足 1 <= x <= n
)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。
请你计算并返回要确定 f
确切的值 的 最小操作次数 是多少?
数据范围
1 <= n <= 1000
分析
二分答案,check
函数传入操作次数k,可以发现,最优情况一定先在
k
k
k层扔,再去
k
+
(
k
−
1
)
k+(k-1)
k+(k−1)层扔,然后
k
+
(
k
−
1
)
+
(
k
−
2
)
k+(k-1)+(k-2)
k+(k−1)+(k−2),以此类推,因此只需要判断最后的层数是否超过建筑高即可
代码
class Solution {
public:
// 14 1 + 13
// 27 2 + 12
// 38 3 + 11
// 48 4 + 10
int find(int l, int r, int n) {
while(l < r) {
int mid = l + r >> 1;
if(check(mid, n)) r = mid;
else l = mid + 1;
}
return l;
}
bool check(int x, int n) {
int now = 0;
for(int i = 1; i <= x; i ++ ) {
now += (x - i + 1);
}
return now >= n;
}
int twoEggDrop(int n) {
int l = 0, r = n;
int res = find(l, r, n);
return res;
}
};