一个题

发现现在脑子的确不好使了,昨天在http://www.cnblogs.com/grenet/archive/2009/12/20/1628425.html看到一个算法题,根据上面递归的提示,写了半天硬是没能写出来。其实,在学校的时候刚开始学C语言的时候就发现递归蛮抽象的,虽然解法的思路很形象,解答过程也很简单,但是感觉很难找到下手的突破口。就是说递归虽然解法简单,但是很难想到。这次也是,弄了半天,也没啥结果,一直弄web的东西,长时间没接触算法,写起来真是慢死了。

后来在一个同学的提示下终于写出来了,不是递归,就是循环而已,不过下标要很仔细,for循环的条件也是要相当细心。 

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

//F(N)=Min(Max(1,1+F(N-1)),Max(2,1+F(N-2)),Max(3,1+F(N-3))……,Max(N-1,1+F(1)))

class list
{
    
public static int Max(int x, int y)
    {
        
return (x >= y) ? x : y;
    }
    
public static List<int> getnumber(int N)
    {
        List
<int> list = new List<int>();
        
if (N >= 2)
        {
            list.Add(
0);
            list.Add(
1);
            
for (int i = 2; i <= N; i++)
            {
                
int min = Max(11 + list[i - 1]);
                
int max = 0;
                
for (int k = i - 1; k >= 1; k--)
                {
                    max 
= Max(k, 1 + list[i - k]);
                    
if (max <= min)
                    {
                        min 
= max;
                    }
                }
                list.Add(min);
            }
        }
        
return list;
    }

    
static void Main(string[] args)
    {
        
int n = 100;
        List
<int> list = getnumber(n);
        
for (int i = 0; i < list.Count; i++)
        {
            Console.Write(list[i]
+",");
        }
    }


}

 

 

第100项结果为14,符合原帖下面一些人的作答,哎,脑子不好使了啊,靠!

PS:原帖作者的思路:

某幢大楼有100层。你手里有两颗一模一样的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎。这幢大楼有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。现在让你设计一种方式,使得在该方式下,最坏的情况扔的次数比其他任何方式最坏的次数都少。也就是设计一种最有效的方式。

  例如:有这样一种方式,第一次选择在60层扔,若碎了,说明临界点在60层及以下楼层,这时只有一颗珠子,剩下的只能是从第一层,一层一层往上实验,最坏的情况,要实验59次,加上之前的第一次,一共60次。若没碎,则只要从61层往上试即可,最多只要试40次,加上之前一共需41次。两种情况取最多的那种。故这种方式最坏的情况要试60次。

  那该如何设计方式呢?

  仔细分析一下,关键是第一次的选择,假设在第N层,如果第一次扔的时候就碎了,那么第二颗珠子只能是从第1层开始一层层往上试,此时,最坏的情况为N-1次,加上第一次,则一共为N层。那如果不碎呢,第二颗珠子会从N+1层开始试吗?很显然不会,此时大楼还剩100-N层,问题就转化为100-N,2颗珠子,请设计最有效方式。

  哦,等等想到什么?呵呵,我想到递归

  定义一个函数F(N),表示N层楼最有效方式最坏情况的次数。

  通过上面的分析,有

  F(N)=Min(Max(1,1+F(N-1)),Max(2,1+F(N-2)),……,Max(N-1,1+F(1)))

  F(1)=1

  本面试题就是求F(100)

 

posted @ 2009-12-20 23:17  Tmac_  阅读(286)  评论(0编辑  收藏  举报