题解:P14042 [SDCPC 2019] Calandar

· · 题解

思路

令人憋不住的日历题(我没看清楚就打了七个星期的名字,结果调了两个小时才发现一个周就五天,无语了)。

先算出两个日期差了多少天,再分类讨论:

我们令 day1 = x1 \times 360 + y1\times 30 + z1,这样就算出了第一个日期到基准点(是什么不重要,但是应该是 000 日)的天数。

然后令 day2 = x2\times 360 + y2\times 30 + z2,这样算出第二个日期到基准点的天数。

运用前缀和思想,day3=day2-day1 就是两者相差的天数。

便于处理,我们可以先把 5 个日期存到某数组 0\sim 4 的位置(因为取模,我写的是 k 数组,下简称 k 数组),然后再把 5 个星期几(Monday 等)存在一个 map<string,int> 中(以下简称 mp)。(这个虽然对代码的正确性没啥大用,但是能让你省事调试方便,大家可以学习一下)。

最后,分两种情况:

代码

送一句话:

计算日期会爆,需要开?下一句你们自己接哈。

#include <bits/stdc++.h>
using namespace std;
#define int long long
string k[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
map <string, int> mp;
void init()
{
    mp["Monday"] = 0;
    mp["Tuesday"] = 1;
    mp["Wednesday"] = 2;
    mp["Thursday"] = 3;
    mp["Friday"] = 4;
}
void man()
{
    int days;
    int x, y, z, xx, yy, zz;
    string s;
    cin >> x >> y >> z >> s >> xx >> yy >> zz;
    days = (xx - x) * 12 * 30 + (yy - y) * 30 + zz - z;
    if (days >= 0) cout << k[((mp[s] + days) % 5 + 5 ) % 5] << endl;
    else cout << k[(mp[s] - ((-days) % 5) + 5) % 5] << endl;
}
signed main()
{
    init();
    int T;
    cin >> T;
    for (int i = 1; i <= T; i ++)man();
    return 0;
}