奶牛问题

今天在网上不小心看到一人说了下奶牛问题,觉得特别有意思,因此自己就试了试。原问题是这么描述的:一头奶牛从出生后的第四年开始生育一头小奶牛,以后每年生育一头,第八年后不再生育,第十年死亡。给你一头刚出生的小奶牛,十五年后共有多少头奶牛?

最开始想了一个方法,就是把所有的奶牛都放在一个链表里面,然后依次循环年数,每次循环对链表内的奶牛进行操作,如果在4到8之间,向链表中插入一个新奶牛,如果等于10 ,那么直接从链表中删除,否则不操作。这样就解决问题了:代码如下:

private static int count(int years) 
        {
            List<bull> bulls = new List<bull>();
            bulls.Add(new bull(1));
            for (int i = 0; i < years; i++ )
            {
                List<bull> newBulls = new List<bull>();
                List<bull> oldBulls = new List<bull>();
                foreach(var b in bulls)
                {
                    
                    if (4 <= b.Age && b.Age < 9) 
                    {
                        newBulls.Add(new bull(1));
                        b.Age += 1;
                    }
                    else if (b.Age == 10)
                    {
                        oldBulls.Add(b);
                    }
                    else 
                    {
                        b.Age += 1;
                        continue;
                    }


                }
                bulls.AddRange(newBulls);
                foreach(var b in oldBulls)
                {
                    bulls.Remove(b);
                }

            }
            return bulls.Count;
        }
问题解决了,自己又想想有没有更简单的,因为这样做效率实在太低了,如果年份多了,链表里面的对象增多,那么所消耗的时间将成几何增长。后来又思索得到一方法,建立一个数组,表示当年的一岁到十岁的奶牛,因为一头奶牛只能活到10岁,所以这个数组就够了。操作方式是依次循环年数,每次循环中,首先要记录的是每年产生的新生奶牛,然后就是奶牛年龄增大(把数组从1依次移动到9)。代码如下:
private static int quickCount(int years) 
        {
            int[] arr = new int[10];
            arr[0] = 1;

            for (int i = 0; i < years; i++ )
            {
                int newCount = 0;
                for (int j = 3; j < 8; j++ )
                {
                    newCount += arr[j];
                }
                
                for (int k = 9; k > 0; k-- )
                {
                    arr[k] = arr[k - 1];
                }

                arr[0] = newCount;
                //foreach(var s in arr)
                //{
                //    Console.Write(s + ",");
                //}
                //Console.WriteLine();
            }

            int count = 0;
            foreach(var c in arr)
            {
                count += c;
            }
            return count;
        }

这个时间永远都是不变的,不会随着年份的增加而增加,唯一的缺点就是不知道每个奶牛的母亲是谁,呵呵,第一种方法可以在奶牛里面加个属性可以记录的,这个就实现不了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值