3388:练67.2 金猪大家庭

【题目描述】

金猪大家庭主要由母猪构成的,小母猪第二年就可以生2只小母猪和2只小公猪,第三年开始每年可以生4只小母猪和4只

小公猪;小公猪在第二年就要被赶出大家庭;猪的寿命只有六年。

目前,一个新的金猪大家庭正在形成:一只小母猪自立门户,创建自己的金猪大家庭。

【输入】

只有一行且只有一个正整数:n(1≤n≤35)。

【输出】

只有一行且只有一个正整数:第n年金猪大家庭的成员数。

【输入样例】

3

【输出样例】

19

原题链接:信息学奥赛一本通-编程启蒙(C++版)在线评测系统

【题目解析】

这题关键点在于:小母猪第二年就可以生2只小母猪和2只小公猪;第三年开始每年可以生4只小母猪和4只小公猪;小公猪在第二年就要被赶出大家庭;猪的寿命只有六年

我们可以设s指存活时间大于等于3且小于6的母猪的数量,a[i]为新出生母猪的数量

s可以由前缀和得到,s+=a[i-2]-a[i-6]。a[i-2]代表可以新出生4只公猪和4只母猪的数量,a[i-6]代表死猪的数量

公猪因为在出生第二年就被赶走,所以第n年留在大家庭的只有第n年新出生的公猪,新出生的公猪数量和新出生的母猪数量相等,即a[n]

母猪的数量由三个部分得到:存活时间大于等于3年小于6年即s,第二年出生的母猪是第n年的新出生母猪即a[n-1],第一年出生的母猪是第n年的新出生母猪即a[n]

通过上述推导可以得出第n年的猪的总数等于s+a[n-1]+2*a[n]

【代码】

//金猪大家庭 
#include<iostream>
#include<cstdio>
using namespace std;
long long s,a[50];
int main()
{
	int n,i;
	cin>>n;
	if(n==1) cout<<1<<endl;//第一年一头母猪输出1 
	else
	{
		n+=5;//从第7年算,这样可以容易表示死猪的数量 
		s=0;//s指存活时间大于等于3且小于6的母猪 
		a[6]=1;//新出生母猪的数量 
		for(i=7;i<=n;i++)
		{
			s+=a[i-2]-a[i-6];//两年前的母猪数量减去六年前的母猪数量得出可以生4只母猪和4只公猪的数量 
			a[i]=a[i-1]*2+s*4;//第i年母猪的数量等于前年的母猪数量乘2加上可以生4只母猪和4只公猪的数量的4倍 
		}
		cout<<s<<" "<<a[n-1]<<" "<<a[n]<<endl; 
		cout<<s+a[n-1]+2*a[n]<<endl;//a[n-1]代表能在n-1年生2只母猪和2只公猪的数量,2*a[n]代表第n年的母猪的数量加公猪的数量 
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值