阿里编程测验

问题
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的情况比较复杂,代码以后补上。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值