【题目描述】
金猪大家庭主要由母猪构成的,小母猪第二年就可以生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;
}