7-27 兔子繁衍问题(15 分)

// 我的思路是三种状态兔子总和<n,第三种状态兔子可以生,在循环里递推。题解思路是斐波那契

// 卡壳,原因是题目的误导性太强了

从出生后第3个月起每个月都生一对兔子,题目的真正意思是兔子长到第三个月的瞬间立刻生一对兔子,也就是二月成熟,花一个月生一对兔子

// 从原文完全看不出这个真正的意思,不知道是不是我语文不好

// 有歧义的题尝试列下情况

// 第一个月 兔子1,出生状态

// 第二个月 兔子1

// 第三个月 兔子1+1

// 第四个月 一开始的兔子生1

// 第五个月 一开始的兔子生1,一开始的兔子的子一代生1

// 题目清楚地说明了兔子刚出生是属于第一个月,理解了这第一个月指的是什么就好办了

// 首先第1个月肯定是一个时间跨度,不可能是兔子出生的时间点

// 那它指的就是兔子被称为“出生第一个月”到“出生第二个月”中间的间隔1->2

// 第二个月就是2->3

// 那第三个月就是3->4,此时就应该生兔子了,也就是一直兔子出生到月份+2就生兔子了,

// 此时可以发现,新出生的兔子数量就是”出生第二个月“到“出生第三个月后”的兔子数量总和,也就是这两种兔子没有区别,可以直接合并,

// 这样就可以在循环中递推每一种兔子的数量了

// “出生第一个月”的兔子数量 = ”出生第二个月“到“出生第三个月后”的兔子数量总和,

// ”出生第二个月“到“出生第三个月后”的兔子数量总和 要多加原来”出生第一个月“的兔子数量

// 用c1表示”出生第一个月“的兔子数量,c2表示”出生第二个月“到“出生第三个月后”的兔子数量总和,代码如下

// 从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死
// 请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
// 内容重复,用递归
// 兔子数量共享,用全局
// 兔子年龄不共享,用局部,
// 兔子年龄为3时开始调用递归,开始加兔子数量,数量达到了n就返回
// 递归没写好,换模拟

// int cnt = 2;
int t;
int n;
// void dfs(int year){
//     while(cnt < n){
        
    
//         year++;
//         t++;
//         cout << t << endl;
    
//         if(year >= 3){
//             dfs(0);
//             cnt+=2;
//         }
//     }
//     return;
// ,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?,t = 1;
// 我的思路是三种状态兔子总和<n,第三种状态兔子可以生,在循环里递推。题解思路是斐波那契
// 卡壳,从出生后第3个月起每个月都生一对兔子,题目的真正意思是兔子长到第三个月的瞬间立刻生一对兔子,也就是二月成熟,花一个月生一对兔子
// 从原文完全看不出这个真正的意思,不知道是我语文不好还是出题人语文不好,
// 有歧义的题尝试列下情况
// 第一个月 兔子1,出生状态
// 第二个月 兔子1 
// 第三个月 兔子1+1
// 第四个月 一开始的兔子生1
// 第五个月 一开始的兔子生1,一开始的兔子的子一代生1
// 题目清楚地说明了兔子刚出生是属于第一个月,理解了这第一个月指的是什么就好办了
// 首先第1个月肯定是一个时间跨度,不可能是兔子出生的时间点
// 那它指的就是兔子被称为“出生第一个月”到“出生第二个月”中间的间隔1->2
// 第二个月就是2->3
// 那第三个月就是3->4,此时就应该生兔子了,也就是一直兔子出生到月份+2就生兔子了,
// 此时可以发现,新出生的兔子数量就是”出生第二个月“到“出生第三个月后”的兔子数量总和,也就是这两种兔子没有区别,可以直接合并,
// 这样就可以在循环中递推每一种兔子的数量了
// “出生第一个月”的兔子数量 = ”出生第二个月“到“出生第三个月后”的兔子数量总和,
// ”出生第二个月“到“出生第三个月后”的兔子数量总和 要多加原来”出生第一个月“的兔子数量
// 用c1表示”出生第一个月“的兔子数量,c2表示”出生第二个月“到“出生第三个月后”的兔子数量总和,代码如下
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int t,n;
int main(){
   cin >> n;
    int c1 = 1,c2 = 0;
    t = 1;
    while(c1+ c2 < n){
       int  a =c1,b = c2;
        c1 = b;
        c2 += a;
        t++;   
        
    }
    cout << t<< endl;
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值