最近做的一道腾讯笔试题,大意是:
腾讯深圳总部大厦有39层。你手里有两颗一模一样的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎。这幢大楼有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。现在让你设计一种方式,使得在该方式下,最坏的情况扔的次数比其他任何方式最坏的次数都少。也就是设计一种最有效的方式。
思路:
动态规划。设楼层N
把问题转换为在39-N里找临界楼层。
假如结果都保存在F[40]这个数组里面,那么:
F[N]=40-N,
F[40]=min(max(1,1+F[N-1]),max(2,1+F[N-2]),……,max(N-1,1+F[1]));
已知状态转移方程,代码就简单了:
#include <iostream>
using namespace std;
//gendlee 2016-9-17
#define N 40
int F[N]={0};
void Test()
{
int temp;
for (int loop1=2; loop1<N; ++loop1)
{
F[loop1]=loop1;
for (int loop2=1; loop2<N;++loop2)
{