题解:洛谷 P1424 小鱼的航程(改进版)

【题目来源】

洛谷:P1424 小鱼的航程(改进版) - 洛谷

【题目描述】

有一只小鱼,它平日每天游泳 \(250\) 公里,周末休息(实行双休日),假设从周 \(x\) 开始算起,过了 \(n\) 天以后,小鱼一共累计游泳了多少公里呢?

【输入】

输入两个正整数 \(x,n\),表示从周 \(x\) 算起,经过 \(n\) 天。

【输出】

输出一个整数,表示小鱼累计游泳了多少公里。

【输入样例】

3 10

【输出样例】

2000

【核心思想】

  1. 问题分析:小鱼平日每天游泳 \(250\) 公里,周末(周六、周日)休息。给定从周 \(x\) 开始,经过 \(n\) 天,求累计游泳里程。这是一个日期周期模拟问题。

  2. 算法选择

    • 逐日模拟:遍历 \(n\) 天,每天判断是否为工作日(周一到周五),累加工作日数量后乘以 \(250\)
  3. 关键步骤

    • 读入数据cin >> x >> n\(x\) 为起始星期(\(1\)=周一,\(7\)=周日),\(n\) 为总天数
    • 初始化ans = 0(工作日计数器)
    • 逐日遍历\(i\)\(0\)\(n-1\)):
      • 计算当前星期:xq = (x - 1 + i) % 7
        • x - 1 将周一映射为 \(0\),便于模 \(7\) 运算
        • + i 表示经过 \(i\) 天后的偏移
        • % 7 得到当前是周几(\(0 \sim 6\) 对应周一到周日)
      • xq < 5(周一到周五):ans++
    • 计算总里程ans * 250
    • 输出结果
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\),遍历 \(n\)
    • 空间复杂度:\(O(1)\),仅需常数个变量
  5. 周期模拟的核心思想

    • 模运算周期性:星期以 \(7\) 为周期循环,用模 \(7\) 运算将任意天数映射到 \(0 \sim 6\)
    • 偏移量计算(x - 1 + i) % 7 统一处理起始星期和经过天数的偏移
    • 工作日判定xq < 5 简洁区分工作日(\(0 \sim 4\))和周末(\(5, 6\)
    • 最后统一乘:先计数工作日天数,最后统一乘以每日里程,避免每日重复乘法
    • 适用于周期计算、工作日统计、日期模拟类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    int x, n;            // 定义变量:x(开始日期的星期几), n(总天数)
    cin >> x >> n;       // 输入开始星期和总天数

    int ans = 0;         // 初始化工作日计数器

    // 循环计算n天中的工作日天数
    for (int i = 0; i < n; i++)
    {
        // 计算当前日期的星期几(0-6对应周一到周日)
        int xq = (x - 1 + i) % 7;

        // 判断是否为工作日(周一到周五)
        if (xq < 5)
        {
            ans++;       // 工作日计数器加1
        }
    }

    // 输出总工资(工作日天数×250元)
    cout << ans * 250 << endl;

    return 0;            // 程序正常结束
}

【运行结果】

3 10
2000
posted @ 2026-08-05 15:45  团爸讲算法  阅读(19)  评论(0)    收藏  举报