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)