• U4699 鸡蛋


     U4699 鸡蛋

      • 0通过
      • 37提交
    • 题目提供者飞翔
    • 标签
    • 难度尚无评定

      

    最新讨论

    • 暂时没有讨论

    题目背景

    调皮的kkk准备恶搞他的同学兼朋友——你!

    题目描述

    kkk准备从楼上扔鸡蛋下来砸在lzn身上,让lzn变成“鸡蛋王子”。但是如果鸡蛋没有破裂,辣么就没有什么好玩的了,所以kkk必须知道鸡蛋最少在哪一层楼上扔下来会摔破。

    kkk为了实验事先买了K个鸡蛋(这些鸡蛋的硬度一样),并来到了一个N层高楼上。每次kkk可以拿着一个鸡蛋从t楼扔下去,并观察鸡蛋有没有摔破。如果鸡蛋在第t层楼没有摔破,那么在1..t-1层楼都不会摔破,而且不论在1..t层楼摔多少次鸡蛋都不会破。

    lzn马上就要过来了,所以你需要帮kkk求出,她最少要做多少次实验。

    输入输出格式

    输入格式:

    有多组数据,每组数据包含两个整数K和N

    输出格式:

    对于每组数据输出最少实验次数,如果实验63次还不能成功,输出TLE

    输入输出样例

    输入样例#1:
    2 100
    1 100
    输出样例#1:
    14
    TLE

    说明

    1<=K<=100

    1<=N<2^64

    题解:

    数据范围太大,二分就拜拜了。

    只能用考虑dp or递推。

    然后自己软腿就推出来了。

    f[i][j]表示i个鸡蛋扔j次恰好是f[i][j]层随

    转移f[i][j]=f[i][j-1]+f[i-1][j-1]+1;

    解释:

    f[i][j]=k表示当有i个鸡蛋时扔j次,若楼层数<=k则可确定唯一楼层!
    那代码中f[a][b]=f[a][b-1]+f[a-1][b-1]+1;表示什么?
    若从某一层扔鸡蛋没碎,剩下了b-1次抛投机会;
    若从该层扔下去碎了,不但少了一个鸡蛋,还少了一次抛投机会。
    由于从第i层扔鸡蛋,没碎则鸡蛋硬度>=i,碎了则硬度<i,所以以上两种情况判断的楼层区间不会重叠。
    但是别忘了扔鸡蛋的那一层……
    所以状态转移方程为f[a][b]=f[a][b-1]+f[a-1][b-1]+1。

    AC代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    long long f[105][3001];
    long long k,n;
    int main(){
        for(int a=1;a<=101;a++)
            for(int b=1;b<=3000;b++)
                f[a][b]=f[a][b-1]+f[a-1][b-1]+1;
        while(cin>>k>>n){
            bool flag=0;
            for(int a=0;a<=63;a++) if(f[k][a]>=n){
                flag=1;
                printf("%d
    ",a);
                break;
            }
            if(!flag) printf("TLE
    ");
        }
        return 0;
    }
  • 相关阅读:
    暑 假 队 测 Round #5
    暑 假 队 测 Round #4
    暑 假 队 测 Round #3
    什么是nginx、CGI、fastCGI、php-fpm、PHP-CGI,fast-CGI 与 php-cgi又是什么关系
    Go源码各目录含义
    User space 与 Kernel space
    Shell脚本编程30分钟入门
    Tomcat7配置及其servlet调用详解
    最简单的移动端适配方案
    textarea元素只设置高可变,宽固定
  • 原文地址:https://www.cnblogs.com/shenben/p/5883040.html
Copyright © 2020-2023  润新知