P5690 题解
LRY314
·
·
题解
我们先看日期,发现日期至多只需要一步就可以改合法,因为不论它是什么数,只要把十位改为 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日修改)