Step 1 题目理解
- 给你两个日期
s
t
a
r
t
d
a
t
e
start_{date}
startdate 和
e
n
d
d
a
t
e
end_{date}
enddate 问你其中有多少个回文日期
- 对回文日期的定义是形如
a
b
c
d
d
c
b
a
abcddcba
abcddcba 的八位数日期
Step 2 做法解析
Step 2.1 做法1
- 考虑枚举在
s
t
a
r
t
d
a
t
e
start_{date}
startdate 和
e
n
d
d
a
t
e
end_{date}
enddate 之间的所有日期,并判断是否为回文日期
- 时间复杂度约为
O
(
365
×
9000
×
8
)
=
O
(
2.628
×
1
0
7
)
O(365 \times 9000 \times 8) = O(2.628 \times 10^7)
O(365×9000×8)=O(2.628×107) (此处忽略了闰年)
- 该做法是我口糊的,并没有写代码,所以就不贴了,理论可行
Step 2.2 做法2
- 由于每一个年份都只对应一个回文日期,所以可以枚举从
1000
1000
1000 到
9999
9999
9999 年之间的所有日期
- 判断是否在合法范围之内并且日期是否日期是否合法,如果是,就将
a
n
s
+
+
ans++
ans++
- 时间复杂度
O
(
9000
×
8
)
=
O
(
72000
)
O(9000 \times 8) = O(72000)
O(9000×8)=O(72000)
Step 3 AC code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int a,b,ans = 0;
cin >> a >> b;
for(int i = 1000; i <= 9999; i++){
int q = i * 10000 + (i % 10) * 1000 + ((i / 10) % 10) * 100 + ((i / 100) % 10) * 10 + (i / 1000);
if(((((i % 10) * 10 + ((i / 10) % 10)) == 1 )|| (((i % 10) * 10 + ((i / 10) % 10)) == 3 )||(((i % 10) * 10 + ((i / 10) % 10)) == 5 )||(((i % 10) * 10 + ((i / 10) % 10)) == 7 ) ||(((i % 10) * 10 + ((i / 10) % 10)) == 8 )||(((i % 10) * 10 + ((i / 10) % 10)) == 10 )||(((i % 10) * 10 + ((i / 10) % 10)) == 12 ) )&&((((i / 100) % 10) * 10 + (i / 1000)) <= 31))
if(a <= q && q <= b) {ans++;}
if(((((i % 10) * 10 + ((i / 10) % 10)) == 4 )||(((i % 10) * 10 + ((i / 10) % 10)) == 6 )||(((i % 10) * 10 + ((i / 10) % 10)) == 9 ) ||(((i % 10) * 10 + ((i / 10) % 10)) == 11 )) &&((((i / 100) % 10) * 10 + (i / 1000)) <= 30))
if(a <= q && q <= b) {ans++;}
if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)){
if((((i % 10) * 10 + ((i / 10) % 10)) == 2 ) && ((((i / 100) % 10) * 10 + (i / 1000)) <= 29))
if(a <= q && q <= b) {ans++;}
}
else{
if((((i % 10) * 10 + ((i / 10) % 10)) == 2 ) && ((((i / 100) % 10) * 10 + (i / 1000)) <= 29))
if(a <= q && q <= b) {ans++;}
}
}
cout << ans << "\n";
return 0;
}