本文主要是介绍CSP认证 201503-3 节日[C++题解]:模拟、枚举、日期题、日期模板题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目分析
来源:acwing
分析:
- 每月有多少天用数组months[]来存储,下标是1 ~ 12,二月存的是平年28天。另外,星期1到星期日的下标是0~6,起点1850 年 1 月 1 日是星期二,它的下标是1.这样的话,可以用一个变量days来记录,某年某月的第一天到1850年1月1日的天数,然后 mod 7 就可以求出星期几!!!
- 判断闰年
is_leap()
,是的话返回1,否则返回0 - 求某年的某月有多少天
get_days_a_month(int year, int month)
,返回天数。
以上三步是求解日期题目的模板!!!
下面是具体到本题的思路:
枚举哪一年,枚举一年中的月份,需要标记每天是星期几,这怎么做呢? 笔者采用的方法是记录该年该月的第一天到1850年1月1日总共过了多少天,用变量days
表示,然后days对 7取模,就可以得到星期几。w = (1 + w) % 7;
这里加1是因为起点那天是周二,下标是1(前文讲到过)。
然后就是枚举,遍历每个月的所有天,找到合法的日期输出。
ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 210;// 每月有多少天
int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
}; int is_leap(int year){if( year % 400 == 0 || year % 4 == 0 && year % 100 )return 1;return 0;
}// 求哪年的每月有多少天
int get_days_a_month(int year, int month){if(month == 2) return months[month] + is_leap(year);return months[month];
}int main(){int a, b, c, y1, y2;cin >> a >> b >> c >> y1 >> y2;int days = 0;for(int year = 1850; year <= y2; year ++){for(int month = 1; month <= 12; month ++){if(year >= y1 && month == a){// w表示该月1号是星期几,cnt 表示当前是第几个星期int w = (1 + days) % 7, cnt = 0;// 枚举该年的所有天,d表示日期for(int d = 1; d <= get_days_a_month(year, month); d ++){// 等于所求的星期几,这里下标从0开始,而不是1,所以c-1if( w == c -1) {cnt ++; // 当前第几个星期if( cnt == b){ // 恰好是所要求的第b个星期,则输出printf("%04d/%02d/%02d\n", year, month, d);break;}}w = (w + 1) % 7; // w不断增加,计算星期几}// 如果没有找到第b个星期,则输出noneif( cnt < b) puts("none");}// 记录某年的某月的1号距离1850年1月1日过了多少天 days += get_days_a_month(year, month);// cout << days << endl;}}}
题目来源
https://www.acwing.com/problem/content/3217/
这篇关于CSP认证 201503-3 节日[C++题解]:模拟、枚举、日期题、日期模板题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!