洛谷 CF899B 题解

本文最后更新于 2024年7月15日 下午

洛谷题目传送门 | CF原题传送门


这个题是让求输入的连续几个月份是否合法。

直接模拟就行了吧

需要注意闰年的情况

大体思路

先打表确定每个月的天数,因为有 2424 个月,所以需要注意包含平年和闰年的全部情况

因为输入是带有空格的,所以预先打表的月份天数之间也要带有空格,我们可以按照 平年、平年、闰年、平年、平年 的顺序预打表。

大概是这个样子:

1
2
//             |平年-------------------------------|平年-------------------------------|闰年-------------------------------|平年--------------------------------|平年-------------------------------
string sample="31 28 31 30 31 30 31 31 30 31 30 31 31 28 31 30 31 30 31 31 30 31 30 31 31 29 31 30 31 30 31 31 30 31 30 31 31 28 31 30 31 30 31 31 30 31 30 31 31 28 31 30 31 30 31 31 30 31 30 31 ";

读入每个月份时,需要用字符串,注意有空格,所以要用 getline ,但如使用 scanf 读入的 nn,需要用 getchar(); 吞上一行的回车

输入字符串时,无需进行任何操作。读完后,直接使用 sample.find(s) 查找。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
// |平年-------------------------------|平年-------------------------------|闰年-------------------------------|平年-------------------------------|平年------------------------------
string sample="31 28 31 30 31 30 31 31 30 31 30 31 31 28 31 30 31 30 31 31 30 31 30 31 31 29 31 30 31 30 31 31 30 31 30 31 31 28 31 30 31 30 31 31 30 31 30 31 31 28 31 30 31 30 31 31 30 31 30 31 ";
int n;
string s;
int main()
{
scanf("%d",&n);
getchar();//吞n后面的回车
getline(cin,s);//读入一整行(包括空格,但不包括回车)
if(sample.find(s)!=string::npos)//判断是否合法
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}

洛谷 CF899B 题解
https://blog.makerlife.top/post/solution-CF899B/
作者
Makerlife
发布于
2022年2月4日
更新于
2024年7月15日
许可协议