题意
问2000年1月1日到9999年12月31日,有几个“202”,有前导零,固定长度为8
题解
这一定是简单题目啊,想什么模拟,模拟那么多细节能够想的到吗,看看,这不就卡了
模拟写完了,还能有什么脑子吗?
简 单 题 先 考 虑 暴 力 , 然 后 再 是 模 拟 \color{red}简单题先考虑暴力,然后再是模拟 简单题先考虑暴力,然后再是模拟
一 定 要 会 算 时 间 复 杂 度 \color{red}{一定要会算时间复杂度} 一定要会算时间复杂度
//debug了好久才过了的模拟
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX = 1e4 + 10;
const int MOD = 1e9 + 7;
int ans[MAX][15][33];
inline bool run(int x) {
if((x % 4 == 0 && x % 100 != 0) || x % 400 == 0) {
return 1;
}
return 0;
}
int mm[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void init() {
int cnt = 0;
ans[2000][1][1] = 0;
for(int y = 2000; y <= 9999; y++) {
int add = 0;
if(run(y)) add = 1;
for(int m = 1; m <= 12; m++) {
mm[2] += add;
for(int d = 1; d <= mm[m]; d++) {
bool flag = 0;
if(y % 1000 == 202 || y / 10 == 202) flag = 1;
if(y % 10 == 2 && m == 2) flag = 1;
if(m % 10 == 2 && d == 2) flag = 1;
if(flag) cnt++;
ans[y][m][d] = cnt;
}
mm[2] = 28;
}
}
}
int main() {
init();
int T;
scanf("%d", &T);
while(T--) {
int y1, m1, d1, y2, m2, d2;
scanf("%d%d%d %d%d%d", &y1, &m1, &d1, &y2, &m2, &d2);
int res = (ans[y2][m2][d2] - ans[y1][m1][d1]);
bool flag = 0;
if(y1 % 1000 == 202 || y1 / 10 == 202) flag = 1;
if(y1 % 10 == 2 && m1 == 2) flag = 1;
if(m1 % 10 == 2 && d1 == 2) flag = 1;
if(flag) res++;
printf("%d\n", res);
}
}
//会T的暴力
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX = 1e4 + 10;
const int MOD = 1e9 + 7;
int ans[MAX][15][33];
bool run(int x) {
if((x % 4 == 0 && x % 100 != 0) || x % 400 == 0) {
return 1;
}
return 0;
}
bool ex(string str) {
for(int i = 0; i <= str.length(); i++) {
if(str[i] == '2' && str[i + 1] == '0' && str[i + 2] == '2')
return 1;
}
return 0;
}
int mm[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void init() {
int cnt = 0;
ans[2000][1][1] = 0;
for(int y = 2000; y <= 9999; y++) {//千万要看清楚题目,不然白wa
int add = 0;
if(run(y)) add = 1;
for(int m = 1; m <= 12; m++) {
mm[2] += add;
for(int d = 1; d <= mm[m]; d++) {
string str = "";
str += to_string(y);
string tmp = to_string(m);
if(tmp.size() == 1) str += "0";
str += tmp;
tmp = to_string(d);
if(tmp.size() == 1) str += "0";
str += tmp;
if(ex(str)) cnt++;
ans[y][m][d] = cnt;
}
mm[2] = 28;
}
}
}
int main() {
init();
int T;
scanf("%d", &T);
while(T--) {
int y1, m1, d1, y2, m2, d2;
scanf("%d%d%d %d%d%d", &y1, &m1, &d1, &y2, &m2, &d2);
int res = (ans[y2][m2][d2] - ans[y1][m1][d1]);
string str = "";
str += to_string(y1);
string tmp = to_string(m1);
if(tmp.size() == 1) str += "0";
str += tmp;
tmp = to_string(d1);
if(tmp.size() == 1) str += "0";
str += tmp;
if(ex(str)) res++;
printf("%d\n", res);
}
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX = 1e4 + 10;
const int MOD = 1e9 + 7;
int ans[MAX][15][33];
inline bool run(int x) {
if((x % 4 == 0 && x % 100 != 0) || x % 400 == 0) {
return 1;
}
return 0;
}
int mm[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void init() {
int cnt = 0;
ans[2000][1][1] = 0;
for(int y = 2000; y <= 9999; y++) {
int add = 0;
if(run(y)) add = 1;
for(int m = 1; m <= 12; m++) {
mm[2] += add;
for(int d = 1; d <= mm[m]; d++) {
bool flag = 0;
if(y % 1000 == 202 || y / 10 == 202) flag = 1;
if(y % 10 == 2 && m == 2) flag = 1;
if(m % 10 == 2 && d == 2) flag = 1;
if(flag) cnt++;
ans[y][m][d] = cnt;
}
mm[2] = 28;
}
}
}
int main() {
init();
int T;
scanf("%d", &T);
while(T--) {
int y1, m1, d1, y2, m2, d2;
scanf("%d%d%d %d%d%d", &y1, &m1, &d1, &y2, &m2, &d2);
int res = (ans[y2][m2][d2] - ans[y1][m1][d1]);
bool flag = 0;
if(y1 % 1000 == 202 || y1 / 10 == 202) flag = 1;
if(y1 % 10 == 2 && m1 == 2) flag = 1;
if(m1 % 10 == 2 && d1 == 2) flag = 1;
if(flag) res++;
printf("%d\n", res);
}
}