01 洛谷 P2010 回文日期
2020-07-19 本文已影响0人
_Mirage
题目不难,但是由于粗心大意提交了3次才完全正确,记录下。
-
第一次错误: 判断日期合法性错误: 只考虑了月份和日期合法的情况(在1-9之间这样的)。没有考虑具体每个月有多少天等等。最后既有结果错误,也有超时:
image.png
看到超时我就想这题肯定会有我没想到的更好的解法。(毕竟我是真的菜。。)
-
第二次错误: 更改了检查日期合法性后,其他测试点都通过了,只剩下最后一个超时的测试点没通过,我就得重新构思下算法:
image.png
![](https://img.haomeiwen.com/i22578190/abb7ad6b3cb1120b.png)
就是最原始的暴力判断,用了一个数组当中间变量,可能也是这些多余的数组操作导致超时很多。
![](https://img.haomeiwen.com/i22578190/05fcc9cb3953415f.png)
经过这样的更改后才侥幸过关。
-
第三次提交:虽然勉强过了,但还是有很大的优化空间,这次提交能过真的完全是侥幸,卡在了超时的边缘:
image.png
也没有深入去想了(毕竟想也想不出来),等到日后自己水平有所提高后再来尝试更优秀的方法吧!
源代码如下:
#include<cstdio>
bool run_year(int num) {
if((num % 4 == 0 && num % 100 != 0) || (num % 400 == 0)) return true;
return false;
}
bool check_valid(int num) {
int year, month, day;
year = num / 10000;
month = num % 10000 / 100;
day = num % 100;
if(month > 12 || month == 0 || day == 0) return false;
if(month == 4 || month == 6 || month == 9 || month == 11) {
if(day <= 30) return true;
}
else if(month == 2) {
if(run_year(year)) {
if(day <= 29) return true;
}
else {
if(day <= 28) return true;
}
}
else {
if(day <= 31) return true;
}
return false;
}
bool check_huiwen(int num) {
int a, b, c, d;
int aa, bb, cc, dd;
a = num / 10000000;
aa = num % 10;
if(a != aa) return false;
b = num / 1000000 % 10;
bb = num / 10 % 10;
if(b != bb) return false;
c = num / 100000 % 10;
cc = num / 100 % 10;
if(c != cc) return false;
d = num / 10000 % 10;
dd = num / 1000 % 10;
if(d != dd) return false;
return true;
}
int solve(int a, int b) {
int cnt = 0;
for(int i = a; i <= b; i++) {
if(check_valid(i)) {
if(check_huiwen(i)) cnt++;
}
}
return cnt;
}
int main(int argc, char const *argv[])
{
int date1, date2;
scanf("%d%d", &date1, &date2);
printf("%d", solve(date1, date2));
return 0;
}