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\n",a);break;}if(!flag) printf("TLE\n");}return 0; }?
轉載于:https://www.cnblogs.com/shenben/p/5883040.html
總結
- 上一篇: 输出联系变化的数字seq
- 下一篇: 解决: Sudamod/CM-13.0