1 条题解

  • 0
    @ 2026-6-19 10:30:45

    📝 题目大意

    在 AtCoder 国的历法中,一年有 MM 个月,每月有 DD 天。给定一个日期 (y,m,d)(y, m, d),求该日期的下一天。

    💡 解题思路

    1. 题目分析:这是一道简单的日期模拟题。数据范围 M,D99M, D \leq 99y[1000,9000]y \in [1000, 9000],直接模拟进位即可,不需要考虑闰年等复杂规则。
    2. 算法推导
      • 先将天数 dd11(进入下一天)。
      • d>Dd > D,说明超出当月天数,则 dd 重置为 11,月份 mm11
      • m>Mm > M,说明超出当年月数,则 mm 重置为 11,年份 yy11
      • 最后输出 y,m,dy, m, d
    3. 边界与细节
      • 月末最后一天:如 d=Dd = D,加 11d=D+1>Dd = D+1 > D,触发月份进位,正确。
      • 年末最后一天:如 m=Mm = Md=Dd = D,先触发月份进位,再触发年份进位,正确。
      • 普通日期:d<Dd < D,仅 dd11mmyy 不变,正确。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),仅常数次判断与赋值。
    • 空间复杂度O(1)O(1),仅使用 55 个整型变量。

    💻 标准代码 (C++)

    #include <iostream>
    using namespace std;
    int main() {
        int M, D, y, m, d;
        cin >> M >> D >> y >> m >> d;
        d++;  // 进入下一天
        if (d > D) {  // 天数超出当月,月份进位
            d = 1;
            m++;
            if (m > M) {  // 月份超出当年,年份进位
                m = 1;
                y++;
            }
        }
        cout << y << " " << m << " " << d << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    760
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者