问题
1. 猎人把一对兔子婴儿(一公一母称为一对)放到一个荒岛上,两年之后,它们生下一对小兔,之后开始每年都会生下一对小兔。生下的小兔又会以同样的方式继续繁殖。
2. 兔子的寿命都是x(x>=3)年,并且生命的最后一年不繁殖。
3. 如果岛上的兔子多于10对,那么猎人会每年在兔子们完成繁殖或者仙逝之后,从岛上带走两对最老的兔子。
请问y年(y>=3)后荒岛上所有的兔子加起来多少岁?(注意, 在条件3执行完之后)
输入: 从命令行输入两行整数,第一行是x,第二行是y
输出: y年后荒岛上所有的兔子岁数的总和
编译器版本: gcc 4.8.4
请使用标准输入输出(stdin,stdout) ;请把所有程序写在一个文件里,勿使用已禁用图形、文件、网络、系统相关的头文件和操作,如sys/stat.h , unistd.h , curl/curl.h , process.h
时间限制: 3S (C/C++以外的语言为: 5 S) 内存限制: 128M (C/C++以外的语言为: 640 M)
输入:
x //兔子的寿命 y //若干年以后
输出:
n //所有兔子的年龄之和
输入范例:
3
3
输出范例:
2
代码如下
满分代码如下
100%测试用例通过
#include <iostream>
#include <list>
using namespace std;
struct Rabbit
{
long long age;
long long num;
Rabbit(long long age, long long num):age(age), num(num){}
};
int main()
{
long long x, y;
while(cin>>x>>y)
{
list<Rabbit> l;
l.push_back(Rabbit(0, 1));
long long sumRabbitNum = 1;
for(int year = 1; year <= y; ++year)
{
list<Rabbit>::iterator it;
for(it = l.begin(); it != l.end(); it++)
{
it->age++;
}
it = l.begin();
while(it != l.end())
{
if(it->age >= x)
{
sumRabbitNum -= it->num;
l.pop_front();
it = l.begin();
}
else break;
}
long long newRabbitCnt = 0;
for(it = l.begin(); it != l.end(); it++)
{
if(it->age >= 2) newRabbitCnt += it->num;
}
if(newRabbitCnt) l.push_back(Rabbit(0, newRabbitCnt));
sumRabbitNum += newRabbitCnt;
if(sumRabbitNum > 10)
{
sumRabbitNum -= 2;
list<Rabbit>::iterator it = l.begin();
if(it->num > 2) it->num -= 2;
else if(it->num == 2) l.pop_front();
else
{
l.pop_front();
it = l.begin();
if(it->num > 1) it->num--;
else
{
l.pop_front();
}
}
}
}
long long sumRabbitAge = 0;
for(list<Rabbit>::iterator it = l.begin(); it != l.end(); it++)
{
sumRabbitAge += it->age * it->num;
}
sumRabbitAge <<= 1;
cout<<sumRabbitAge<<endl;
}
return 0;
}
方法二
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int Age2(int x,int y,int i,int *a,int *b);
void Age3(int x,int y,int *a,int *b){
//在下面写出有y>=x的情况
//....................
}
void Age(int x,int y,int *a,int *b )
{
int i = y - 1;
a[0]=1;
a[1]=0;
b[0] = y ;
b[1] = y - 1;
Age2(x,y,i,a,b);
}
int Age2(int x,int y,int i,int *a,int *b)
{
if(i==0)
return 1;
if(i==1)
return 0 ;
a[i] = Age2(x,y,i-1,a,b) + Age2(x,y,i-2,a,b);
b[i] = y - i;
return a[i];
}
int main ()
{
int x,y;
cin>>x>>y;
int *a;
int sum1= 0;
a = (int*)malloc(y*sizeof(int));
int *b;
b = (int*)malloc(y*sizeof(int));
if(y>=x){
Age3(x,y,a,b);
for(int i=y-x+1;i<y;i++)
{
sum1 = sum1 + a[i]*b[i];
}
cout<<2*sum1<<endl;
}else{
Age(x,y,a,b);
int sum = 0;
for(int i=0;i<y;i++)
{
sum+= a[i];
}
if(sum >= 10){
int i = 0;
while(a[i]==0){
i++;
}
if(a[i]>=2){
a[i]=a[i]-2;
}
else{
a[i] =0;
i++;
while(a[i]==0){
i++;
}
if(a[i]>=2){
a[i]=a[i]-1;
}
else{
a[i]=0;
}
}
}
for(int i=0;i<y;i++)
{
sum1 = sum1 + a[i]*b[i];
}
cout<<2*sum1<<endl;
}
system("pause");
return 0;
}
代码测试用例通过了50%,当x大于y时,结果都正确;
考虑到x等于小于y的情况比较复杂,代码以后补上。