小韦老师@神犇营-my0121-金币
题目:
描述
国王将金币作为工资,发放给忠诚的骑士。
第 1 天,骑士收到一枚金币;之后两天(第 2 天和第 3 天)里,每天收到两枚金币;之后三天(第 4、5、6 天)里,每天收到三枚金币;之后四天(第 7、8、9、10 天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续 n 天每天收到 n 枚金币后,骑士会在之后的连续 n+1 天里,每天收到 n+1 枚金币(n 为任意正整数)。
你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。
输入
一个整数(范围 1 到 10000),表示天数。
输出
骑士获得的金币数。
输入样例1
6
输出样例1
14
思路:
整体思路:
来看天数的和金币的变化规律:
天数:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
金币:1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6
什么时候的涨金币呢?当已经连续发了 m 天,每天都发 m 块金币,这个时候
就该涨金币了。例如:
第 1 天连续 1 天,每天都发了 1 块金币,要将金币涨成 2 块金币。
第 3 天连续 2 天,每天都发了 2 块金币,要将金币涨成 3 块金币。
第 6 天连续 3 天,每天都发了 3 块金币,要将金币涨成 4 块金币。
第 10 天连续 4 天,每天都发了 4 块金币,要将金币涨成 5 块金币。
第 15 天连续 5 天,每天都发了 5 块金币,要将金币涨成 6 块金币。
……
也就是说,在每天发金币的时候,除了要记录今天要发多少金币以外,还要
记录已经连续发了多少天了。如果连续发的天数已经等于所发的金币数,则
应该要涨金币了,第二天所发的金币数应该要加 1。
具体步骤:
1.定义 n,用来表示天数,并且输入 n。
2.定义 3 个变量,用来记录当前要发的金币数,已发总的金币数,和发一样
的金币数,已经连续发了多少天。
int gold = 1; // 当前金币数,初始化为 1
int sum = 0; // 总的金币数,初始化为 0
int day = 0; // 用来记录发当前金币数,已经连续多少天,初始化为 0
3.枚举 1~n,处理每一天的情况:
1)将当前所发金币累加到总的金币数中。
2)发当前金币数的连续天数加 1。
3)若发 gold 块金币已经连续发 gold 天,则涨金币,并且将连续天数归 0。
for (int i = 1; i <= n; i++) {
sum += gold; // 累计金币
day++; // 连续天数加 1
if (day == gold) { // 若发 gold 块金币已经连续发 gold 天
gold++; // 涨金币(金币加 1)
day = 0; // 连续天数归 0,这里不要忘了
}
}
4.输出总的金币数。
完整代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int gold = 1; // 当前金币数,初始化为 1
int sum = 0; // 总的金币数,初始化为 0
int day = 0; // 用来记录发当前金币数,已经连续多少天,初始化为 0
for (int i = 1; i <= n; i++) {
sum += gold; // 累计金币
day++; // 连续天数加 1
if (day == gold) { // 若发 gold 块金币已经连续发 gold 天
gold++; // 涨金币(金币加 1)
day = 0; // 连续天数归 0,这里不要忘了
}
}
// 输出总的金币数
cout << sum;
return 0;
}