【第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);
        }
    }
}


posted @ 2021-04-10 11:10  Hyx'  阅读(43)  评论(0)    收藏  举报