您的位置:首页 > 其它

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 MB

Description

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

4

10 1

100 2

30 30

2000000000 2

Sample Output

10

14

5

Impossible
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: