题解:洛谷 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

【核心思想】

  1. 问题分析:给定速度 \(S\)、跑步时间 \(A\)、静止时间 \(B\) 和总时间 \(X\),高桥以周期 \(A+B\) 重复"跑 \(A\) 秒 + 静止 \(B\) 秒"。求 \(X\) 秒内总共跑的距离。这是一个周期模拟/整除分块问题,关键在于将总时间拆分为完整周期和剩余时间分别计算。

  2. 算法选择

    • 周期拆分:利用整数除法和取模,将 \(X\) 秒拆分为 \(t\) 个完整周期和 \(t_2\) 秒剩余时间
    • 分段计算:完整周期按满额距离计算,剩余时间按实际跑步时长计算
  3. 关键步骤

    • 读取输入:读入 \(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\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),仅若干次算术运算
    • 空间复杂度:\(O(1)\),仅需常数个变量
  5. 周期模拟的核心思想

    • 模运算拆分\(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
posted @ 2026-08-27 11:03  团爸讲算法  阅读(7)  评论(0)    收藏  举报