日期
日期
这道题比较水,但还是十分值得深思的,有点像数学里的分类讨论问题。
-
日期为 \(31\)
-
月份为 \(1,3,5,7,8,10,12\) 无需修改。
-
月份为 \(2,4,6,9,11\) 改 \(1\) 次(都改成 \(1\) 月)。
-
除掉以上合法的月份,当个位为 \(4,6,9\) 时,修改十位不能达到目的。
-
其他情况均可以 \(1\) 次成功,如果各位为 \(0,2\),改成 \(10\) 月;否则将其十位改成 \(0\)。
-
-
日期为 \(29,30\)
- 如果是 \(2\) 月或者是其他不合法的月份,修改一次;\(2\) 月改 \(1\) 月;个位为 \(0,2\) 改十位为 \(10,12\)。其他情况直接改十位为 \(0\)。
- 否则,无需修改。
-
日期为 \(1\sim 28\)
- 月份合法无需修改
- 月份不合法修改,同 \(29,30\) 第一点的改法。
-
日期不合法
- 个位为 \(0\) 改为 \(10\),否则改成个位的数。
- 如果月份不合法,修改一次,同 \(29,30\) 第一点的改法。
综上,所有情况都已分析完,时间复杂度 \(O(1)\)。
#include<bits/stdc++.h>
using namespace std;
int m,d;
int main(){
scanf("%d-%d",&m,&d);
if(d==31){
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)puts("0");
else if(m==2||m==4||m==6||m==9||m==11)puts("1");
else if(m%10==4||m%10==6||m%10==9)puts("2");
else puts("1");
}
else if(d==29||d==30){
if(m==2||m==0||m>12)puts("1");
else puts("0");
}
else if(d>0&&d<=28){
if(m>0&&m<=12)puts("0");
else puts("1");
}
else if(m==0||m>12)puts("2");
else puts("1");
return 0;
}