Loading

加载过慢可尝试刷新

【题解】洛谷 CF899B Months and Years

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


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

直接模拟就行了吧

需要注意闰年的情况

大体思路

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

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

大概是这个样子:

//             |平年-------------------------------|平年-------------------------------|闰年-------------------------------|平年--------------------------------|平年-------------------------------
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 读入的 \(n\),需要用 getchar(); 吞上一行的回车

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

完整代码

#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;
}
posted @ 2022-02-04 16:35  Makerlife  阅读(30)  评论(0)    收藏  举报