题解:洛谷 AT_abc428_a Grandma's Footsteps
【题目来源】
洛谷:AT_abc428_a [ABC428A] Grandma's Footsteps - 洛谷
【题目描述】
高桥正在学校玩游戏。游戏从铃响的时刻开始。
铃响后,高校会马上开始重复以下动作:
- 以 \(S\) 米每秒的速度向前跑 \(A\) 秒。接下来,保持静止 \(B\) 秒。
铃响过后 \(X\) 秒时,他总共跑了多少米?
【输入】
一行四个整数 \(S,A,B,X\)。
【输出】
输出一行一个整数表示答案。输出中忽略单位(米)。
【输入样例】
7 3 2 11
【输出样例】
49
【核心思想】
-
问题分析:给定速度 \(S\)、跑步时间 \(A\)、静止时间 \(B\) 和总时间 \(X\),高桥以周期 \(A+B\) 重复"跑 \(A\) 秒 + 静止 \(B\) 秒"。求 \(X\) 秒内总共跑的距离。这是一个周期模拟/整除分块问题,关键在于将总时间拆分为完整周期和剩余时间分别计算。
-
算法选择:
- 周期拆分:利用整数除法和取模,将 \(X\) 秒拆分为 \(t\) 个完整周期和 \(t_2\) 秒剩余时间
- 分段计算:完整周期按满额距离计算,剩余时间按实际跑步时长计算
-
关键步骤:
- 读取输入:读入 \(S, A, B, X\)
- 完整周期数:\(t = X / (A + B)\),每个周期跑 \(S \times A\) 米
- 完整周期距离:\(ans = S \times A \times t\)
- 剩余时间:\(t_2 = X \% (A + B)\)
- 剩余时间距离:
- 若 \(t_2 \ge A\):剩余时间内跑完整个 \(A\) 秒,加 \(S \times A\)
- 若 \(t_2 < A\):剩余时间内只跑了 \(t_2\) 秒,加 \(S \times t_2\)
- 输出 \(ans\)
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),仅若干次算术运算
- 空间复杂度:\(O(1)\),仅需常数个变量
-
周期模拟的核心思想:
- 模运算拆分:\(X = t \times (A+B) + t_2\),将线性时间转化为周期数 + 余数,避免逐秒模拟
- 边界分类讨论:剩余时间 \(t_2\) 与 \(A\) 的大小关系决定跑步是否被静止截断,体现"完整部分 + 残缺部分"的分析框架
- 适用于"周期性重复动作 + 求总量"类问题,核心是用整除替代循环
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int s; // 每个时间单位产生的物品数量
int a; // 机器A的工作时间
int b; // 机器B的休息时间
int x; // 总时间
int ans; // 总产量
int main()
{
// 输入参数
cin >> s >> a >> b >> x;
// 计算完整的工作周期数
int t = x / (a + b);
// 计算完整周期内的产量(每个周期生产s*a个物品)
ans += s * a * t;
// 计算剩余时间的产量
int t2 = x % (a + b);
// 如果剩余时间大于等于机器A的工作时间
if (t2 >= a)
{
// 剩余时间内机器A可以完整工作
ans += s * a;
}
else
{
// 剩余时间内机器A只能部分工作
ans += t2 * s;
}
// 输出总产量
cout << ans << endl;
return 0;
}
【运行结果】
7 3 2 11
49
浙公网安备 33010602011771号