题解:P5690 [CSP-S 2019 江西] 日期
513 字
3 分钟
题解:P5690 [CSP-S 2019 江西] 日期

先读题
这题说实话并不难,但是细节真的超级超级多
正解
我们很容易就可以发现,对于不符合要求的月份或日期,做多只需更改一位(即十位或百位)
那么日期就很好处理了,如果日期大于这个月份的天数,直接ans++即可
难点在于怎么正确处理不符合的月份
极为明确的是,如果我们在月份处理后这个月份的天数尽可能大,就会少一些不必要去变动日期的情况
例:
input: output: realoutput:22-30 1 2很明显,把月份变成可以比变成多出几天不用变日期的情况,虽然很少,但决定了本题是否能AC
所以理清一下我们的处理思路:
1.先处理月份,对于等于的情况,随便设置为一个有天的月份即可;对于的情况,无需变动
2.对于的情况,分类讨论,如果的个位大于,把十位设为即可;如果个位为,将设为;如果个位为,将设为(因为月天数比月天数多);如果个位为,将设为(因为月天数比月天数多)
3.在处理完月份后,如果日期大于这个月份的天数,直接ans++
4.输出ans即可
:
#include<iostream>#include<string>#include<string.h>#include<vector>#include<queue>#include<map>#include<stack>#include<set>#include<functional>#include<utility>#include<algorithm>#include<cmath>#include<climits>#include<tuple>#include<numeric>#include<any>#include<bitset>#define int long longusing namespace std;const int N = 1e5 + 10, M = 31;int n, m, ans;char tmp;vector <int> _31ds;signed main() { cin.tie(nullptr)->ios::sync_with_stdio(false); _31ds.push_back(1); _31ds.push_back(3); _31ds.push_back(5); _31ds.push_back(7); _31ds.push_back(8); _31ds.push_back(10); _31ds.push_back(12); cin >> n >> tmp >> m; if (n == 0) n = 8, ans++; if (n > 12) { ans++; if (n % 10 > 2) n %= 10; else if (n % 10 == 1) n = 1; else if (n % 10 == 2) n = 12; else if (n % 10 == 0) n = 10; } if (n == 2) ans += m > 28; else if(find(_31ds.begin(),_31ds.end(),n)!=_31ds.end()) ans += m > 31; else ans += m > 30; cout << ans; return 0;}支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
题解:P5690 [CSP-S 2019 江西] 日期
https://azx.xn--0iv.gay/posts/solution-p5690/相关文章智能推荐
1
题解:P1111 修复公路
题解题解:P1111 修复公路
2
题解:P1360 [USACO07MAR] Gold Balanced Lineup G
题解题解:P1360 [USACO07MAR] Gold Balanced Lineup G
3
一些冷门但好用的STL容器
OISTL真的很好用
4
关于我的OI代码缺省源
OI以后懒得写了直接复制
5
从0写软件-Win32应用代码模板
C++有点像大份
随机文章随机推荐











