【岁月留痕】

【问题描述】

       给定 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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值