327 字
2 分钟
【洛谷】B2669

原文链接:https://www.luogu.com.cn/problem/P2669

本文许可:CC BY 4.0

【洛谷 B2669】金币(NOIP 2015 普及组 T1)#

[原题跳转]


题目一句话#

国王发工资:

  • 第 1 天给 1 枚;
  • 接下来连续 2 天,每天给 2 枚;
  • 再接下来连续 3 天,每天给 3 枚;
  • ……

问前 k 天一共拿到多少金币?
数据范围:1 ≤ k ≤ 10 000,随便模拟。


举个栗子(k = 6)#

天数区间每天金币发了几天小计
11 枚1 天1×1 = 1
2~32 枚2 天2×2 = 4
4~63 枚3 天3×3 = 9
总计14 枚

思路:把“大块”当成一个整体#

把相同金币的连续天数看成一整块,一块一块地啃:

  1. 当前块应该发 i 枚金币,最多连发 i 天;
  2. 剩余天数 k 不足 i 天,就有多少天算多少天;
  3. 金币 += 天数 × 金币数,剩余天数减掉,进入下一块 i+1。

Mermaid 流程图(可缩放)#

flowchart TD
    A([开始]) --> B["读入 k"]
    B --> C["初始化<br>total=0, i=1"]
    
    C --> D{k > 0 ?}
    D -- 是 --> E["days = min(k, i)"]
    E --> F["total += days × i"]
    F --> G["k -= days"]
    G --> H["i += 1"]
    H --> D
    D -- 否 --> I["输出 total"]
    I --> J([结束])

代码实现#

k = int(input()) # 还要发多少天
total = 0 # 金币总和
i = 1 # 当前块每天发 i 枚
while k > 0: # 只要还有天数就继续
days = min(k, i) # 本轮实际发几天
total += days * i # 累加金币
k -= days # 扣掉已发天数
i += 1 # 进入下一块
print(total)

简单秒掉~

【洛谷】B2669
https://mikufans.yuzhiyuan.top/posts/洛谷p2669/
作者
遇缘
发布于
2025-11-15
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

最后更新于 ,距今已过 323 天

部分内容可能已过时