2015浙江理工校赛 E Power Eggs (DP)
2015-12-21 20:29
281 查看
题解
一开始没想到DP题,只是想起google面试有这个,上网搜了一下dp[i][j]为i个鸡蛋j个楼层测试的数目,想直接套到这个题目上,后来看了一下数据..楼层有上亿个…怎么开数组,当时就蒙了,还想打表找规律…
其实灵活一点的话可以看到题目说了测试的次数如果大于32次就可以输出Impossible了,就是说不用算了,既然楼层不能在数组的下标中表示出来,那为什么不换一下,dp[i][j]表示i个鸡蛋测试j次所能测出来的最大楼层不就行了吗?
那么按照DP的思想来想一下,鸡蛋扔下去,有两种情况,要么破,要么不破,dp[i][j]=dp[i-1][j-1]+1+dp[i][j-1],当鸡蛋数只有1个时dp[1][j]=j,dp[i][j]=2^j-1(i< j)
代码
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> /*long long DroppingMax(int eggs,long long times) { if (eggs==1) return times; if (eggs>=times) return (long long)pow(2.0,times)-1; return DroppingMax(eggs,times-1)+DroppingMax(eggs-1,times-1)+1; } long long Dropping(int eggs,long long floors) { long long times = 1; while (DroppingMax(eggs,times) < floors) { ++times; if (times>32) return -1; } return times; }*/ long long dp[35][35]; using namespace std; int main() { dp[0][0]=1; for (int i = 1;i<35;i++) for (int j = 1;j<35;j++) { dp[i][i]=pow(2.0,i)-1; dp[1][j]=j; if (i>j) dp[i][j]=dp[j][j]; } for (int i = 2;i<=32;i++) for (int j = 2;j<=32;j++) dp[i][j]=dp[i-1][j-1]+dp[i][j-1]+1; int T; scanf("%d",&T); while (T--) { int e; long long f; scanf("%lld%d",&f,&e); int flag = 0; for (int i = 1;i<=32;i++) { if (dp[e][i]>=f) { printf("%d\n",i); flag=1; break; } } if (!flag) printf("Impossible\n"); } }
附上几个网站供学习
/article/7571420.html
/article/6887314.html
题目
Power Eggs
Time Limit: 1 Sec Memory Limit: 128 MBDescription
Benedict bought K identical power eggs from Dropeggs.com, and now he wants to test them by dropping them from different floors of his building. His building has N floors numbered 1 to N. F is an unknown number in the range from 0 to N, inclusive. Each egg will break if dropped from floor F+1 or above, but will not break if dropped from floor F or below. Benedict can drop each egg as many times as he wants from any floor until it breaks. He wants to know the minimum number of egg drops necessary to ensure that he can determine F.For example, if there are three floors and Benedict has only one egg, then he has to first throw the egg from the first floor, then from the second floor (if the egg survived), and then from the third floor (if the egg survived). Therefore, three drops are required in the worst case
Input
The first line contains one number T (1 ≤ T ≤ 10000) which is the number of test cases, followed by T lines. Each of the next T lines contains two numbers: N, the number of floors (1 ≤ N ≤ 2000000007) and K, the number of eggs (1 ≤ K ≤ 32).Output
For each of the T lines, print the minimal number of drops required, or if it’s greater than 32, print the word Impossible. After that many drops, Benedict gets too tired and cannot continue.Sample Input
410 1
100 2
30 30
2000000000 2
Sample Output
1014
5
Impossible
相关文章推荐
- String Game【ZSTUOJ--4212】
- 论文笔记:《the Google File System》
- [GDOI模拟2015.12.19][HEOI2013]SAO
- git常用指令合集
- java web 开发技术应用-过滤器
- Git使用教程
- LeetCode Valid Parentheses
- 图形学优化_3: 责任链模式和迭代器模式
- 抽象思维实现各种不同的接口调用
- 论文笔记:《Google MapReduce》
- 求助大神
- 轻松学习JavaScript二十三:DOM编程学习之操作表格
- 自定义剪切板,UIMenuController的使用
- cocos2D-x 3.5 引擎解析之--引用计数(Ref),自己主动释放池(PoolManager),自己主动释放池管理器( AutoreleasePool)
- DrawRect
- android开发中遇到的异常总结
- 【郑轻】[1755]Statistics!
- 探究二维数组
- java实现大数相加问题
- swift中判断设备是否打开定位