文章

【GESP】C++二级练习 luogu-p2669, [NOIP2015 普及组] 金币

GESP二级练习,循环分支嵌套,略有难度,难度★✮☆☆☆。

luogu-P2669 [NOIP2015 普及组] 金币

题目要求

题目描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 $n$ 天每天收到 $n$ 枚金币后,骑士会在之后的连续 $n+1$ 天里,每天收到 $n+1$ 枚金币。

请计算在前 $k$ 天里,骑士一共获得了多少金币。

输入格式

一个正整数 $k$,表示发放金币的天数。

输出格式

一个正整数,即骑士收到的金币数。

样例输入 #1

1
6

样例输出 #1

1
14

样例输入 #2

1
1000

样例输出 #2

1
29820

提示

【样例 1 说明】

骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 $1+2+2+3+3+3=14$ 枚金币。

对于 $100\%$ 的数据,$1\le k\le 10^4$。


题目分析

方法一

  1. 初始化一个变量 count 来存储骑士收到的金币总数。
  2. 初始化一个变量 days 来表示当前的天数,初始值为 1。
  3. 使用一个循环来模拟每一天的金币发放。每次循环,骑士会在连续 days 天内,每天收到 days 枚金币。
  4. 在每次循环中,使用一个内部循环来模拟连续 days 天的金币发放。每天,count 会增加 days 枚金币,i 会增加 1,表示时间流逝。
  5. 当内部循环结束后,days 会增加 1,表示骑士开始收到更多的金币。
  6. i 等于或超过 k 时,循环结束,输出 count 的值,即骑士在前 k 天收到的金币总数。4

方法二

  1. 初始化一个变量 count 来存储骑士收到的金币总数。
  2. 初始化一个变量 days 来表示当前的天数,初始值为 1。
  3. 初始化一个变量 now_coins 来表示当前天数收到的金币数,初始值为 1。
  4. 使用一个循环来模拟每一天的金币发放。每次循环,骑士会在连续 days 天内,每天收到 now_coins 枚金币。
  5. 在每次循环中,count 会增加 now_coins 枚金币,days 会减少 1,表示时间流逝。
  6. days 等于 0 时,now_coins 会增加 1,表示骑士开始收到更多的金币,days 会重置为 now_coins
  7. i 等于或超过 k 时,循环结束,输出 count 的值,即骑士在前 k 天收到的金币总数。


示例代码

方法一代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
int main() {
    int k; // 输入的整数
    cin >> k;
    int count = 0; // 计数器
    int days = 1; // 天数
    int temp_count = 0; // 临时计数器
    for (int i = 1; i <= k; ) { // 主循环
        for (int j = 1; j <= days && i <= k; j++) { // 内循环
            count += days; // 计数器累加
            i++; // 主循环计数器递增
        }
        days++; // 天数递增
    }
    cout << count; // 输出计数器的值
    return 0;
}

方法二代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int main() {
    int k; // 输入的整数
    cin >> k;
    int count = 0; // 计数器
    int days = 1; // 当前天数
    int now_coins = 1; // 当前天数收到的金币数
    for (int i = 1; i <= k; i++) { // 从1到k天的循环
        count += now_coins; // 计数器累加当前天数的金币数
        days--; // 天数减1
        if (days == 0) { // 如果天数减到0
            now_coins++; // 当前天数收到的金币数增加1
            days = now_coins; // 重置天数为当前天数收到的金币数
        }
    }
    cout << count; // 输出计数器的值
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权