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
方法一:
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)