【第k个星期x】 节日
传送门
题意
给定\(a,b,c ,y_1,y_2\) ,求出 \(y_1\sim y_2\) 年间所有的第a月第b个星期c的时期,格式为yyyy/mm/dd,已知 1850/1/1 是星期二
数据范围
\(1\leq a\leq 12\)
\(1\leq b\leq 5\)
\(1\leq c\leq 7\)
\(1850\leq y_1,y_2\leq 2050\)
题解
- 维护距离起始日期的天数,枚举每一年的每一月,如果年份满足且月份等于指定月就遍历这个月
- 统计当前是第几个,如果等于直接输出,最后判断一下这个月如果不等于就输出
none
Code
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, n) for(int i = a; i < n; i ++)
int a, b, c, yl, yr;
int months[13] = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
int is_leap(int year) {
if(year % 4 == 0 && year % 100 || year % 400 == 0)
return 1;
return 0;
}
int get_days(int year, int month) {
if(month == 2) return months[month] + is_leap(year);
return months[month];
}
int main () {
cin>>a>>b>>c>>yl>>yr;
c --;
int days = 0;
rep(y, 1850, yr + 1) {
rep(m, 1, 13) {
if(y >= yl && m == a) {
int w = (1 + days) % 7, cnt = 0; // 第一天是星期几,给定的第几个
rep(d, 1, get_days(y, m) + 1) { // 枚举这个月份
if(w == c) {
cnt ++;
if(cnt == b) {
printf("%04d/%02d/%02d\n", y, m, d);
break;
}
}
w = (w + 1) % 7;
}
if(cnt < b) puts("none");
}
days += get_days(y, m);
}
}
}

浙公网安备 33010602011771号