专栏文章
题解:P14042 [SDCPC 2019] Calandar
P14042题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minvmuxa
- 此快照首次捕获于
- 2025/12/02 09:05 3 个月前
- 此快照最后确认于
- 2025/12/02 09:05 3 个月前
思路
令人憋不住的日历题(我没看清楚就打了七个星期的名字,结果调了两个小时才发现一个周就五天,无语了)。
先算出两个日期差了多少天,再分类讨论:
我们令 ,这样就算出了第一个日期到基准点(是什么不重要,但是应该是 年 月 日)的天数。
然后令 ,这样算出第二个日期到基准点的天数。
运用前缀和思想, 就是两者相差的天数。
便于处理,我们可以先把 个日期存到某数组 的位置(因为取模,我写的是 数组,下简称 数组),然后再把 个星期几(
Monday 等)存在一个 map<string,int> 中(以下简称 )。(这个虽然对代码的正确性没啥大用,但是能让你省事,调试方便,大家可以学习一下)。最后,分两种情况:
-
这种情况我们直接往后推,输出 即可。
-
否则,我们需要往前推,输出 ,其中 的意思是防止出现负数,从而不输出。别问,问就是本人调了半天,我一直以为是我 组数据,少了几个。
代码
送一句话:
计算日期会爆,需要开?下一句你们自己接哈。
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 条评论,欢迎与作者交流。
正在加载评论...