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;
}
原文地址:https://www.cnblogs.com/shenben/p/5883040.html