57-小明的彩灯(蓝桥杯)

该程序读取输入,处理关于彩灯亮度变化的操作,然后计算每个彩灯在所有操作后的最终亮度。如果亮度为负,则输出0。程序使用了动态规划的方法存储和更新每个位置的亮度差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述】

小明拥有 N 个彩灯,第 i 个彩灯的初始亮度为 ai

小明将进行 Q 次操作,每次操作可选择一段区间,并使区间内彩灯的亮度 +xx 可能为负数)。

Q 次操作后每个彩灯的亮度(若彩灯亮度为负数则输出 00)。

【输入格式】

第一行包含两个正整数 NQ,分别表示彩灯的数量和操作的次数。

第二行包含 N 个整数,表示彩灯的初始亮度。

接下来 Q 行每行包含一个操作,格式如下:

### 蓝桥杯 2021 省赛 B组 最少刷题数 C++ 解法 #### 题目解析 此问题的核心在于模拟小明每日刷题的过程并判断在哪一天累计完成的题目数量达到或超过目标值 \(n\)。通过分析每周的工作模式,可以得出以下结论: - **工作日(周一到周五)**:每天完成 \(a\) 道题目。 - **周末(周六和周日)**:每天完成 \(b\) 道题目。 为了高效解决该问题,可以通过分阶段累加的方式逐步逼近目标值 \(n\),直到满足条件为止[^2]。 --- #### 实现思路 1. 定义变量存储当前已完成的总题目数 `total` 和已过去的天数 `days`。 2. 使用循环逐天增加题目数,并更新 `total` 和 `days` 的值。 3. 当前一周结束时(即经过了 7 天),重新开始新的一周。 4. 循环终止条件为 `total >= n`。 5. 返回最终所需的天数 `days`。 以下是基于上述逻辑的 C++ 实现代码: ```cpp #include <iostream> using namespace std; int main() { long long a, b, n; cin >> a >> b >> n; long long total = 0; // 已完成的题目总数 int days = 0; // 过去的天数 while (true) { // 周一至周五 for (int i = 0; i < 5 && total < n; ++i) { total += a; days++; if (total >= n) break; } if (total >= n) break; // 周六和周日 for (int i = 0; i < 2 && total < n; ++i) { total += b; days++; if (total >= n) break; } if (total >= n) break; } cout << days; return 0; } ``` --- #### 关键点说明 1. **数据范围处理** 根据题目描述中的约束条件 \(1 \leq a, b, n \leq 10^{18}\),需使用 `long long` 类型来防止溢出。 2. **效率优化** 如果直接按天逐一累加可能会导致性能瓶颈,因此可以在每次完整的一周结束后快速跳过多个周期,减少不必要的迭代次数[^3]。 --- #### 测试用例验证 对于给定样例输入: ``` 10 20 99 ``` 程序运行过程如下: - 第 1 至第 5 天:\(10 \times 5 = 50\), 总计 50 题; - 第 6 天(周六):\(50 + 20 = 70\); - 第 7 天(周日):\(70 + 20 = 90\); - 第 8 天(下周一):\(90 + 10 = 100\) (满足条件)。 输出结果为: ``` 8 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮被咬碎成星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值