1 条题解

  • 0
    @ 2026-10-18 18:28:45

    G2018 [GESP202503 二级] 时间跨越 题解

    知识点:日期模拟、闰年判断、进位处理。

    解题思路

    先给小时加k,满24则进一天;日期超过本月天数时进入下个月,月份超过12则进入下一年。二月按闰年规则求天数。

    为什么正确

    按小时、日、月依次进位,保证每个量落在对应合法范围,新时刻与增加的小时数一致。

    易错点

    当前代码利用题目k的范围最多跨一天;扩展到更大的k须循环进位,世纪闰年也需正确判断。

    复杂度

    本题时间O(1),空间O(1)。

    参考代码(C++17)

    #include<bits/stdc++.h>
    
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int y,m,d,h,k;
        cin>>y>>m>>d>>h>>k;
        h+=k;
        if(h>=24) {
            h-=24;
            d++;
            int ds[]= {
                0,31,28,31,30,31,30,31,31,30,31,30,31
            }
            ;
            int days=ds[m]+(m==2&&(y%400==0||(y%4==0&&y%100!=0)));
            if(d>days) {
                d=1;
                m++;
                if(m==13) {
                    m=1;
                    y++;
                }
            }
        }
        cout<<y<<" "<<m<<" "<<d<<" "<<h;
    }
    

    说明

    本题解为配套教学整理,非官方题解。复杂度按本页参考实现计算,题库使用10个自行生成的测试点。

    • 1

    信息

    ID
    656
    时间
    1000ms
    内存
    512MiB
    难度
    进阶
    标签
    递交数
    6
    已通过
    1
    上传者