题解:P5690 [CSP-S2019 江西] 日期

封面

题目

思路:

首先依据常识写出每月的天数。

然后考虑怎么修改最小。

先考虑 MM 的修改。

为了使修改次数最小我们应尽可能的在 MM 这个月份不存在时在保证修改次数最小的情况下将他修改成每月天数尽可能多的月份。

依据这个思路 MM 的修改可以分为两种情况。

  1. 月份为 00,我们可以将 MM 修改为 11,因为 11 月有 3131 天,且在月份为 00 时只用修改一次。
  2. 月份大于 1212 时,又可以分为两种情况:当 MM 是十的倍数时,把月份修改成 1010,因为 1010 月有 3131 天,且当 MM 是十的倍数时,月份日期的第二个字符一定是 00,由此只用修改一次;当 MM 不是十的倍数时,又可以分情况,当第二个字符也就是个位为 11 或 22 时,实际上是可以修改第一个字符为 11,但是要依据上面的思想“这个月份不存在时将他修改成每月天数尽可能多的月份”由此当月份为 1111 时修改成 11 月更优,因为 1111 月有 3030 天而 11 月有 3131 天并且都只要修改一次,对于个位不为 11 或 22 的其它情况,为了保证修改次数最小可以只保留个位,只需要修改一次就是把第一个字符修改成 00,例如月份为 2525,修改后为 0505,也就 55 月。

接着考虑 DD 的修改。

考虑到每个月份都至少有 1919 天,因此在这个日不存在时,可以把它的第一个字符修改成 11,例如 5656 修改后为 1616。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int m,d;
char ch;
int myts[14]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};// 每月天数
int main(){
cin>>m>>ch>>d;
int ans=0;
if(m==0)ans++,m=1;
if(m>12){
ans++;
if(m%10==0)m=10;
else m=(m%10==2?10+m%10:m%10);
}
if(d>myts[m]||d==0){
ans++;
d=d%10+10;
}
cout<<ans;
return 0;
}