前言
老规矩 开始之前唠一唠写这个题的初衷。事情是这样的,一个很偶然的机会,我做到了这道名为母牛的故事的题,做出来之后听到隔壁同学们恰好在讨论这个题的解法,什么递归啊,动态规划啊,斐波那契等等一系列我做的时候完全没有考虑过的玩意儿,这方法懂倒是能懂,但是万一考试或者其他情况紧急的时候完全想不起来这种解题方法可怎么办,真是一想到这种可能性就开始头大(哭泣)
于是 我又来了~~ 无脑模拟生牛全过程,它!!!不香吗
(当然能用其他有严谨理论支撑的方法自然是更好的)
题目
题目描述
有一头母牛,它每年年中生一头小母牛。每头小母牛从第四个年头开始,每年年中也生一头小母牛。请编程实现在第 n 年的时候(不算第 n 年出生的小母牛),共有多少头母牛?
输入
输入包括一个整数 n (0 < n < 55)。
输出
输出在第 n 年的时候母牛的数量。
样例
Sample Input
2
Sample Output
2
Sample Input 2
5
Sample Output 2
6
思路剖析
- 因为我们是无脑模拟生牛全过程,所以当然要有一个专业的养殖场(其实就是各种变量的合体),现在来分析一下都需要什么设(bian)备(liang)吧!
首先要有一个东西来记录当年能生仔的牛的数量(代码里的a)。然后呢,因为新生的小牛在第四年才能生仔,出生和生仔之间有一个时差,所以要记录每年新生的一批小牛,四年以后才能知道又多了多少可以生仔的牛!又考虑到在出生和生仔间隔的几年里,不断会有新的牛出生准备生仔,所以呢我准备了一个数组来记录新出生的牛牛(small[])。
于是养殖场全景如下:
别问为什么用手画,问就是电脑操作不熟练画不好看(委屈巴巴) - 养殖场建设完毕,要开始经营(模拟流程)啦
首先,由题可得当年的牛牛总数是不算当年出生的新牛的,所以在模拟牛牛出生前要把现有牛牛数量统计好(其实就是加上上一年新出生的牛牛就好)。
然后呢,在新牛出生之前,要把这一年新生牛牛区里刚刚能生小牛的牛牛赶到成熟牛牛区,为新生牛牛腾位置。(至于为什么新生牛牛区只有三个位置,是因为到第四年新生牛牛就成熟了,所以只需要三个位置轮换就好)。
然后小牛牛出生啦!新生牛牛的数量就是当年成熟牛牛区的牛牛数量哦(别忘了把刚生的牛牛放进新生牛牛区)
大概把前几年的情况列了一个表格
我们可以明显的看到,其实数组下表是0-2循环的,所以在模拟的过程中不要忘了改变下标!( i 的边界条件就是这么模拟的,我刚开始搞不清楚也是因为这个i,模拟一下就好了)
完整代码
#include<stdio.h>
int main(void) {
int a = 1, i = 0, count = 0, n = 0, sum = 0;
int small[3] = { 0 };
//一定要初始化,刚开始成熟牛牛是1只,新生牛牛区一只都没有哦,sum为0是因为刚开始生仔之前有加一次!
scanf("%d", &n);
while (count < n) {
sum += a; //加上前一年出生的牛牛
a += small[i]; //把新成熟的牛牛挪到成熟牛牛区,加入生仔行列
small[i] = a; //生仔啦,新出生的牛牛放进刚空出来的新生牛牛区
i++; //这个牛牛区填满了,下次要处理下一个牛牛区啦
if (i == 3) i = 0; //因为新生牛牛区只有三个,下标多了要处理一下
//恰好一轮之后,下标再次停留的这批牛牛成熟(刚好第四年)
count++;
}
printf("%d\n", sum);
return 0;
}
仔细琢磨琢磨小细节,会收获很多小惊喜哒~
写在最后
无脑模拟其实是我现阶段最喜欢用的方法(嘿嘿),主要呢是因为其他正儿八经算法咱也想不到咱也想不出来,人家要啥咱就给啥嘛,反正呢过程也是这么个过程,造就完事。(嘻~)