奶牛问题
来源:互联网 发布:java替换所有特殊字符 编辑:程序博客网 时间:2024/04/29 17:15
今天在网上不小心看到一人说了下奶牛问题,觉得特别有意思,因此自己就试了试。原问题是这么描述的:一头奶牛从出生后的第四年开始生育一头小奶牛,以后每年生育一头,第八年后不再生育,第十年死亡。给你一头刚出生的小奶牛,十五年后共有多少头奶牛?
最开始想了一个方法,就是把所有的奶牛都放在一个链表里面,然后依次循环年数,每次循环对链表内的奶牛进行操作,如果在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; }
这个时间永远都是不变的,不会随着年份的增加而增加,唯一的缺点就是不知道每个奶牛的母亲是谁,呵呵,第一种方法可以在奶牛里面加个属性可以记录的,这个就实现不了。
- 奶牛问题
- 奶牛问题
- 奶牛问题
- 奶牛问题
- 奶牛问题3:奶牛派对
- 奶牛产子问题
- 经典“奶牛问题”
- 树形问题--奶牛大集会
- Fibonacci扩展(奶牛问题)
- 奶牛
- 腾讯面试题(奶牛产子问题)
- 分治递归之奶牛过河问题
- 奶牛生子问题(腾讯面试题)
- 奶牛博览会——双背包问题
- P1868 饥饿的奶牛(区间问题)
- 奶牛生子问题(关键字,奶牛,生子,第4年,母牛,每年生一只,20年)
- C语言_递归算法-奶牛生子问题
- C语言奶牛生子的问题(腾讯面试题)
- C++ 位操作符
- javascript DOM (getElementByName)全选-反选-全不选
- 1029
- pat 1023
- 实现隔行变色
- 奶牛问题
- javascript DOM(getElementById)全选-反选-全不选
- oracle 删除重复数据
- HEVC开源代码之openHEVC
- 数据挖掘:Top 10 Algorithms in Data Mining(五)EM算法
- 软件工程师的十个“不职业”行为
- 【小蒙淘金】3.3周评-贵金属下周行情分析及部分操作建议
- SIFT特征提取分析
- 1012