P5690 题解

· · 题解

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

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

$2.$ 日期 $=31$,月份为 $1,3,5,7,8,10,12$ 时合法,答案为 $0$。 如果月份本身合法但日期超了,那么改日期十位即可,答案为 $1$。 月份不合法时,如果月份十位为 $1$,那么改十位即可;如果月份十位不为 $1$,个位为 $1,3,5,7,8$ 时可将十位改为 $0$,个位为 $0,2$ 时可将十位改为 $1$,答案为 $1$;而个位为 $4,6,9$ 时需要额外一步改月份,答案为 $2$。 $3.$ 日期 $=30$ 或日期 $=29$,月份合法 ($2$ 除外)时均不需要修改,答案为 $0$。 而月份为 $2$ 时,只需改日期为 $20$,答案为 $1$;月份不合法时,如果月份个位为 $2$ 则把月份改为 $12$,否则就把月份十位改为 $0$,答案为 $1$。 $4.$ $1≤$ 日期 $≤28$,此时若月份合法则不需修改,答案为 $0$,否则仅用一步即可把月份改合法,答案为 $1$。 综上所述,在合并一些情况后,我们可以得到如下代码: ```cpp #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日修改)