https://ok.hn.cn/p/GESP2312C2A

问题描述

为了准备考试,小杨每天都要做题。第 1 天,小杨做了 a 道题;第 2 天,小杨做了 b道题;从第 3 天起,小杨每天做的题目数量是前两天的总和。 此外,小杨还规定,当自己某一天做了大于或等于 m 题时,接下来的所有日子里,他就再也不做题了。 请问,到了第 N 天,小杨总共做了多少题呢?

输入描述

总共 4 行。第一行一个整数a ,第二行一个整数b ,第三行一个整数m ,第四行一个整数N 。 保证 0≤a,b≤10;a,b < m ≤ 1000 ;3 ≤ N≤ 364

输出描述

一行一个整数,表示小杨N 天里总共做了多少题目。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任 何提示信息。

题解

因为输入描述中,明确N >= 3 ,所以可以忽略 只有 1 天或 2 天的情况。

  
#include <bits/stdc++.h>  
using namespace std;  
int main() {  
    int a, b, n, m, c;  
    int ans;  
    cin >> a >> b >> m >> n;  
    ans = a + b;//前两天做题总数  
    for(int i = 3; i <= n; i++) {//枚举第3天到第n天  
        c = a + b;//第i天做的题是前两天的总和  
        ans += c;//求和  
        a = b;//昨天做的题变成前天做的题  
        b = c;//今天做的题变成昨天做的题  
        if (c >= m) {//如果今天做的题大于等于m,不再做题  
            break;  
        }  
    }  
    cout << ans;  
    return 0;  
}  

视频讲解

从样例 2中可以看出,这是类斐波那契数列 求和的题型,可以先把数列以数列的形式先存储起来,再添加判断某一天的值是不是超过 M

image.png

方法一:

a = int(input())  
b = int(input())  
m = int(input())  
n = int(input())  
  
ti = [a,b]  
for i in range(2,n):  
    tmp = ti[i-2] + ti[i-1]  
    ti.append(tmp)  
ans = 0  
for j in range(n):  
    ans += ti[j]  
    if ti[j] >= m :  
        break;  
  
print(ans)  

方法二:

a = int(input())  
b = int(input())  
m = int(input())  
n = int(input())  
  
ans = a + b  
for i in range(2, n):  
    tmp = a + b  
  
    ans += tmp  
  
    a = b  # 昨天变成前天  
    b = tmp  # 今天变成昨天  
  
    if (tmp >= m):  
        break  
  
print(ans)