HZNU2010(献给我们还在努力刷题的童鞋)

传送门

题意:emmmm,好像也没办法再解释了什么了,题目本来就是中文,没读懂的童鞋可以多读几遍。

题解: 题目都指明是用数组了,只要开一个范围合适的数组,给定开头三个值,然后通过for循环将后续对应的值一一求出就可以了。

(被迫继续营业)这道题用数组求解总应该可以理解吧,然后再赘述一下为什么是  a[i]=a[i-1]*2-a[i-3];题目里的猪猪们繁殖周期都非常的短,出生后的第二天就能繁殖,又因为全是母猪(至于为什么没有公猪和没有公猪要怎么繁殖的问题,就,,挺好玩的不是吗。),所以不管那一天有几头老猪几头小猪,第二天都一视同仁具有生崽能力,因此第i天出生的猪仔数量就是前一天猪的总量,即:i出生 = a[i-1]。但同时,生下第二头猪的猪妈妈会被杀掉,所以我们在计算的时候要减去这一部分的值,问题就在,要杀的猪妈有多少。第i天要杀的猪妈,其实在第i-2天才刚出生,而第i-1天出生的猪仔等于第i-3天的猪总量,即:i杀 = a[i-3]。所以第i天的猪总量 = 第i天的猪总量 + 第i天出生的猪仔数量 - 第i天需要杀掉的猪妈数量。综上所述(有点高中答题的赶脚): a[i] = a[i-1]*2 - a[i-3]

然后题目就明了吧,还不明了?对,数组,for循环,从头求到尾就行了。这样就应该能做了吧,不是不行?文字解释看不懂?苦笑.JPG,作为一个廉价劳动力的卑微助教,我还录了视频,,,简直公开处刑好吧。消化不良的童鞋可以博客配合视频一起食用。如果,如果这样以后还有疑问,第二天机房见(强颜欢笑.JPG)。

#include
int main(){
	int t, n;
	scanf("%d",&t);
	int a[20] = {0,1,2,3};
	for(int i=4;i<20;i++)
		a[i]=a[i-1]*2-a[i-3];
	while(t--){
		scanf("%d", &n);
		printf("%d\n", a[n]);
	}
	return 0;
}

(我又回来了)这种有明显规律的数组求解,也可以用函数的方法来解决。什么是函数?emm, main()就是一个函数,自定义函数是我们为了完成某项任务而编写的,是为了求解第i天的猪的数量,同时也有让主程序更简洁的功能(当然原代码已经足够简洁了)。函数在这里应该怎么用?递归,我们可以通过递归的方法,求出题目要求的值。什么是是递归?哇这,在我看来,递归就是“套娃”。HZNU2010(献给我们还在努力刷题的童鞋)_第1张图片

int ans(){

	return ans();
} 

ans函数中再次调用ans函数, 这不就是套娃吗,口误,是递归。那这个递归具体应该怎么用呢?上面已经分析过第i天的猪数量怎么求了,那么同理,ans(i)表示求得第i天的猪的数量,那函数里就应该是 return 2*ans(i-1) - ans(i-3);然后呢,如果你就这样写这个函数,然后运行,你会发现你得不到任何东西。我递归了个寂寞?实际上,这个函数他跳不出他的递归了,每次都继续调用函数,却没人告诉它应该在什么时候结束。所以,禁止套娃!HZNU2010(献给我们还在努力刷题的童鞋)_第2张图片

不是,其实再给他一些指令就好了,比如说i==1时,返回1(第一天猪的数量就是1嘛)。因为函数调用中,包含一个ans(i-3) ,我们为了防止函数因为套娃行径把i一直套到负数,所以我们应该告诉它:i==1时,返回1;i==2时,返回2;i==3时,返回3.这样,函数就能正常调用了。

#include
int ans(int n){
	if(n==1 || n==2 || n==3)	return n;	
	return 2*ans(n-1) - ans(n-3);
} 
int main(){
	int t, n;
	scanf("%d", &t);
	while(t--){
		scanf("%d", &n);
		printf("%d\n", ans(n));
	}
	return 0;
}

(文末bb:本来出的是hznu1684 的一个结构体排序的题目,反复斟酌以后还是决定出这一道题。如果有人对前面1684的题目感兴趣,可以看我的博客(早就写好了,又被迫改了题目又写了一篇)hznu1684 结构体排序 题解。

你可能感兴趣的:(HZNU2010(献给我们还在努力刷题的童鞋))