327 字
2 分钟
【洛谷】B2669
本文许可:CC BY 4.0
【洛谷 B2669】金币(NOIP 2015 普及组 T1)
题目一句话
国王发工资:
- 第 1 天给 1 枚;
- 接下来连续 2 天,每天给 2 枚;
- 再接下来连续 3 天,每天给 3 枚;
- ……
问前 k 天一共拿到多少金币?
数据范围:1 ≤ k ≤ 10 000,随便模拟。
举个栗子(k = 6)
| 天数区间 | 每天金币 | 发了几天 | 小计 |
|---|---|---|---|
| 1 | 1 枚 | 1 天 | 1×1 = 1 |
| 2~3 | 2 枚 | 2 天 | 2×2 = 4 |
| 4~6 | 3 枚 | 3 天 | 3×3 = 9 |
| 总计 | 14 枚 |
思路:把“大块”当成一个整体
把相同金币的连续天数看成一整块,一块一块地啃:
- 当前块应该发
i枚金币,最多连发i天; - 剩余天数
k不足i天,就有多少天算多少天; - 金币 += 天数 × 金币数,剩余天数减掉,进入下一块
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)简单秒掉~
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 323 天
部分内容可能已过时