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)。
1 #include<stdio.h> 2 int main(){ 3 int t, n; 4 scanf("%d",&t); 5 int a[20] = {1,2,3}; 6 for(int i=4;i<20;i++) 7 a[i]=a[i-1]*2-a[i-3]; 8 while(t--){ 9 scanf("%d", &n); 10 printf("%d\n", a[n]); 11 } 12 return 0; 13 }
(我又回来了)这种有明显规律的数组求解,也可以用函数的方法来解决。什么是函数?emm, main()就是一个函数,自定义函数是我们为了完成某项任务而编写的,是为了求解第i天的猪的数量,同时也有让主程序更简洁的功能(当然原代码已经足够简洁了)。函数在这里应该怎么用?递归,我们可以通过递归的方法,求出题目要求的值。什么是是递归?哇这,在我看来,递归就是“套娃”。
1 int ans(){ 2 3 return ans(); 4 }
ans函数中再次调用ans函数, 这不就是套娃吗,口误,是递归。那这个递归具体应该怎么用呢?上面已经分析过第i天的猪数量怎么求了,那么同理,ans(i)表示求得第i天的猪的数量,那函数里就应该是 return 2*ans(i-1) - ans(i-3);然后呢,如果你就这样写这个函数,然后运行,你会发现你得不到任何东西。我递归了个寂寞?实际上,这个函数他跳不出他的递归了,每次都继续调用函数,却没人告诉它应该在什么时候结束。所以,禁止套娃!
不是,其实再给他一些指令就好了,比如说i==1时,返回1(第一天猪的数量就是1嘛)。因为函数调用中,包含一个ans(i-3) ,我们为了防止函数因为套娃行径把i一直套到负数,所以我们应该告诉它:i==1时,返回1;i==2时,返回2;i==3时,返回3.这样,函数就能正常调用了。
1 #include<stdio.h> 2 int ans(int n){ 3 if(n==1 || n==2 || n==3) return n; 4 return 2*ans(n-1) - ans(n-3); 5 } 6 int main(){ 7 int t, n; 8 scanf("%d", &t); 9 while(t--){ 10 scanf("%d", &n); 11 printf("%d\n", ans(n)); 12 } 13 return 0; 14 }
(文末bb:本来出的是hznu1684 的一个结构体排序的题目(我自认为是灰常简单的),可是我们的单总一再提醒我们给你们找一些舒适宜人的题目,让你们都能有参与感。所以这才出现了末题是简单数组应用的情况。如果有人对前面1684的题目感兴趣,可以看我的博客(早就写好了,又被迫改了题目又写了一篇)https://blog.csdn.net/m0_46187157/article/details/107032453。奔涌吧,后浪!
标签:题目,函数,童鞋,int,HZNU2010,递归,ans,return,刷题 来源: https://www.cnblogs.com/0424lrn/p/13223319.html