题解:P14042 [SDCPC 2019] Calandar
思路
令人憋不住的日历题(我没看清楚就打了七个星期的名字,结果调了两个小时才发现一个周就五天,无语了)。
先算出两个日期差了多少天,再分类讨论:
我们令
然后令
运用前缀和思想,
便于处理,我们可以先把 Monday 等)存在一个 map<string,int> 中(以下简称
最后,分两种情况:
-
-
否则,我们需要往前推,输出
k_{(mp_s-(-day3)+5)\bmod 5} ,其中+5 的意思是防止出现负数,从而不输出。别问,问就是本人调了半天,我一直以为是我T 组数据,少了几个。
代码
送一句话:
计算日期会爆,需要开?下一句你们自己接哈。
#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;
}