A - Calandar
基本信息
题目出处 | 2019 山东省大学生程序设计竞赛 |
队伍通过率 | 297/307 (96.7%) |
题解
因为每年都是 \(12\) 个月,每个月都是 \(30\) 天,因此可以认为 \(y\) 年 \(m\) 月 \(d\) 日是第 \((y \times 12 \times 30 + m \times 30 + d)\) 天。利用起始和目标天数的差值算出星期几即可。
复杂度 \(\mathcal{O}(1)\)。
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | #include <bits/stdc++.h>
using namespace std;
// 星期的名称
char D[5][10] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
// 读入一个 y-m-d 的日期,并返回这是第几天
long long input() {
long long y, m, d; scanf("%lld%lld%lld", &y, &m, &d);
return y * 12 * 30 + m * 30 + d;
}
void solve() {
long long a = input();
// 把字符串转化成一个星期里的第几天
char s[10]; scanf("%s", s);
long long c;
for (c = 0; c < 5; c++) if (strcmp(s, D[c]) == 0) break;
long long b = input();
// 利用起始和目标天数的差值,算出目标日期是一周里的第几天
c = ((c + b - a) % 5 + 5) % 5;
printf("%s\n", D[c]);
}
int main() {
int tcase; scanf("%d", &tcase);
while (tcase--) solve();
return 0;
}
|