OneCoder Avatar
OneCodercoderli.com · 962 篇博文
二级

C++ 算法考级专栏

真题分析、矩阵探测、递归回溯与基础语法

🎨 视觉封面

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

📅 2025-01-27·✍️ OneCoder·计算中...·⏱️ 6 分钟
#GESP#C++#多重循环

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

luogu-P2669 [NOIP2015 普及组] 金币

题目要求

题目描述

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

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

输入格式

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

输出格式

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

样例输入 #1

CONSOLE 1 行
6

样例输出 #1

CONSOLE 1 行
14

样例输入 #2

CONSOLE 1 行
1000

样例输出 #2

CONSOLE 1 行
29820

提示

【样例 1 说明】

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

对于 100%100\% 的数据,1k1041\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 天收到的金币总数。

示例代码

方法一代码

C++ 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;
}

方法二代码

C++ 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;
}

💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

读者讨论与留言

0 条讨论
✨ 支持点击留言直接回复 · Markdown 引用格式
💬 还没有读者留言,快来成为第一个讨论者吧!