// 我的思路是三种状态兔子总和<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; }