【题解】洛谷 CF899B Months and Years
这个题是让求输入的连续几个月份是否合法。
直接模拟就行了吧。
需要注意闰年的情况。
大体思路
先打表确定每个月的天数,因为有 \(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;
}