【问题描述】
给定 n (1 ≤ n ≤ 24)个正整数a1、a2、...、an,请判断这 n 个数是否是连续 n 个月份的天数,这些月份可以跨年度。
【输入形式】
输入第一行为一个整数 n,第二行为n个正整数 a1、a2、...、an(28 ≤ ai ≤ 31)。
【输出形式】
输出Yes或No。
【样例输入1】
4 31 31 30 31
【样例输出1】
Yes
【样例输入2】
2 30 30
【样例输出2】
No
【样例输入3】
5 29 31 30 31 30
【样例输出3】
Yes
#include <iostream>
using namespace std;
int main()
{
int n,check=0;
cin >> n;
int a[36],b[n];
a[0]=a[2]=a[4]=a[6]=a[7]=a[9]=a[11]=a[12]=a[14]=a[16]=a[18]=a[19]=
a[21]=a[23]=a[24]=a[26]=a[28]=a[30]=a[31]=a[33]=a[35]=31;
a[3]=a[5]=a[8]=a[10]=a[15]=a[17]=a[20]=a[22]=a[27]=a[29]=a[32]=a[34]=30;
a[1]=a[13]=a[25]=28;//1<=n<=24,故应该定义一个三年的数组,n个月份才能全覆盖
//此处赋值较为繁琐,uu们可以提出更简单的方法
for(int i=0;i<n;i++)
{
int num;
cin >> num;
if(check==0&&num==29)
{
num--;
check++;
} //上方赋值没有29的天数,但我们可以把29处理为28,但要注意两年内不能
//有2个29,故我们只把一个29处理,所以有check==0的条件
b[i]=num;//再把题目给的一串月份赋值到b数组中
}
for(int j=0;j<36;j++)
{
if(b[0]==a[j])//先找出第一个月份所在位置,再将后续月份一一比较,
//相同则sum+1,若sum等于n说明在a数组中存在这么一串b数组
{
int sum=0;
for(int k=0,l=j;k<n&&l<36;k++,l++)
{
if(b[k]==a[l])
sum++;
}
if(sum==n)
{
cout << "Yes" << endl;
return 0;
}
}
}
cout << "No" << endl;
}