专栏文章

题解:P14042 [SDCPC 2019] Calandar

P14042题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minvmuxa
此快照首次捕获于
2025/12/02 09:05
3 个月前
此快照最后确认于
2025/12/02 09:05
3 个月前
查看原文

思路

令人憋不住的日历题(我没看清楚就打了七个星期的名字,结果调了两个小时才发现一个周就五天,无语了)。
先算出两个日期差了多少天,再分类讨论:
我们令 day1=x1×360+y1×30+z1day1 = x1 \times 360 + y1\times 30 + z1,这样就算出了第一个日期到基准点(是什么不重要,但是应该是 000000 日)的天数。
然后令 day2=x2×360+y2×30+z2day2 = x2\times 360 + y2\times 30 + z2,这样算出第二个日期到基准点的天数。
运用前缀和思想,day3=day2day1day3=day2-day1 就是两者相差的天数。
便于处理,我们可以先把 55 个日期存到某数组 040\sim 4 的位置(因为取模,我写的是 kk 数组,下简称 kk 数组),然后再把 55 个星期几(Monday 等)存在一个 map<string,int> 中(以下简称 mpmp)。(这个虽然对代码的正确性没啥大用,但是能让你省事调试方便,大家可以学习一下)。
最后,分两种情况:
  • day3>0day3>0 这种情况我们直接往后推,输出 k(mps+day3)mod5k_{(mp_s+day3)\bmod 5} 即可。
  • 否则,我们需要往前推,输出 k(mps(day3)+5)mod5k_{(mp_s-(-day3)+5)\bmod 5},其中 +5+5 的意思是防止出现负数,从而不输出。别问,问就是本人调了半天,我一直以为是我 TT 组数据,少了几个。

代码

送一句话:
计算日期会爆,需要开?下一句你们自己接哈。
CPP
#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;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...