1 条题解

  • 0
    @ 2025-8-24 22:13:27

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar LRY314
    ……

    搬运于2025-08-24 22:13:27,当前版本为作者最后更新于2021-07-21 15:47:11,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    我们先看日期,发现日期至多只需要一步就可以改合法,因为不论它是什么数,只要把十位改为 11 就一定合法。

    再看月份,由于日期的合法性受月份影响,我们把判断分为以下几块:

    1.1. 日期 =0=0 或日期 >31>31,一定不合法,需要一步改日期,月份若合法则答案为 11,否则为 22,因为月份在日期用一步改为小于等于 2828 的数后可以改成 111212 中任何数,这至多需要一步。

    2.2. 日期 =31=31,月份为 1,3,5,7,8,10,121,3,5,7,8,10,12 时合法,答案为 00

    如果月份本身合法但日期超了,那么改日期十位即可,答案为 11

    月份不合法时,如果月份十位为 11,那么改十位即可;如果月份十位不为 11,个位为 1,3,5,7,81,3,5,7,8 时可将十位改为 00,个位为 0,20,2 时可将十位改为 11,答案为 11;而个位为 4,6,94,6,9 时需要额外一步改月份,答案为 22

    3.3. 日期 =30=30 或日期 =29=29,月份合法 (22 除外)时均不需要修改,答案为 00

    而月份为 22 时,只需改日期为 2020,答案为 11;月份不合法时,如果月份个位为 22 则把月份改为 1212,否则就把月份十位改为 00,答案为 11

    4.4. 11≤ 日期 28≤28,此时若月份合法则不需修改,答案为 00,否则仅用一步即可把月份改合法,答案为 11

    综上所述,在合并一些情况后,我们可以得到如下代码:

    #include<bits/stdc++.h>
    using namespace std;
    int m,d;
    int main()
    {
        //scanf("%d-%d",&m,&d);
        if(d>0&&d<=28)
        {
            if(m>0&&m<=12)cout<<0;
            else cout<<1;
        }
        else if(d==29||d==30)
        {
            if(m==2||m==0||m>12)cout<<1;
            else cout<<0;
        }
        else if(d==31)
        {
            if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)cout<<0;
            else if(m==2||m==4||m==6||m==9||m==11||m>=13&&m<=19)cout<<1;
            else if(m%10==4||m%10==6||m%10==9)cout<<2;
            else cout<<1;
        }
        else if(m==0||m>12)cout<<2;
        else cout<<1;
    } 
     
    

    我大括号喜欢换行别说我

    (10月6日修改)

    (3月20日修改)

    • 1

    信息

    ID
    4728
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者