力扣10.13

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+(k1)层扔,然后 k + ( k − 1 ) + ( k − 2 ) k+(k-1)+(k-2) k+(k1)+(k2),以此类推,因此只需要判断最后的层数是否超过建筑高即可

代码

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; 
    }
};
上一篇:12.JVM类加载机制


下一篇:【触想智能】工控一体机在智能机器人领域应用的优势与市场展望