2024第15届蓝桥杯省赛C/C++大学A组第一题A题解:艺术与篮球

 

问题描述:

        小蓝出生在一个艺术与运动并重的家庭中。 妈妈是位书法家,她希望小蓝能通过练习书法,继承她的艺术天赋,并练就一手好字。爸爸是一名篮球教练,他希望小蓝能通过篮球锻炼身体,培养运动的激情和团队合作的精神。为了既满足妈妈的期望,又不辜负爸爸的心意,小蓝决定根据日期的笔画数来安排自己的练习。首先,他会将当天的日期按照“YYYYMMDD ”的格式转换成一个 8 位数,然后将这 8 位数对应到汉字上,计算这些汉字的总笔画数。如果总笔画数超过 50 ,他就去练习篮球;如果总笔画数不超过 50 ,他就去练习书法。
        例如,在 2024 1 1 日这天,日期可表示为一个 8 位数字 20240101 ,其转换为汉字是“二零二四零一零一”。日期的总笔画数为 2 + 13 + 2 + 5 + 13 + 1 + 13 + 1 = 50,因此在这天,小蓝会去练习书法。
        以下是汉字的笔画数对照表:
汉字:零,一,二,三,四,五,六,七,八,九
笔画数:13,1,2,3,5,4,4,2,2,2
        现在,请你帮助小蓝统计一下,在 2000 1 1 日到 2024 4 13 日这段时间内,小蓝有多少天是在练习篮球?
【答案提交】
        这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。答案为3228。

方法一:枚举

        从20000101枚举到20240413,计算每一天的日期笔画总数,统计大于50的日期总数。

        使用三重循环遍历,第一层循环表示年份year,从2000到2024。第二层循环表示月份month,从1到12。第三层循环表示day,将每个月的天数存到数组day[]中,从1遍历到day[month]。使用一个函数count()计算日期的笔画数,方法是通过对10取余获得数字的最后一位,将其笔画数num[x]累加,再将数字除以10直到数字变为0结束while循环,并统计位数,如果小于2要手动补一个0。

        第一次循环枚举之后再单独枚举2024年剩下的日期,和所有的闰年2月份。细节见代码及注释。

#include<bits/stdc++.h>
using namespace std;

int num[13]={13,1,2,3,5,4,4,2,2,2};//数字i对应的笔画数num[i]
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//每个月i对应的总天数day[i]

int count(int x);//计算一个数字的笔画总数

int main()
{
	int ans=0;//答案,打篮球的天数

	for(int y=2000;y<=2023;y++)//遍历年份
	{
		for(int m=1;m<=12;m++)//遍历月份
		{
			for(int d=1;d<=day[m];d++)//遍历天份
			{
                if(count(y)+count(m)+count(d)>50) ans++;//如果笔画总数大于50,打篮球天数+1
			}
		}
	}

	day[4]=13;//2024年的4月份只遍历到13号
	for(int y=2024;y<=2024;y++)//遍历年份
	{
		for(int m=1;m<=4;m++)//遍历月份
		{
			for(int d=1;d<=day[m];d++)//遍历天份
			{
                if(count(y)+count(m)+count(d)>50) ans++;//如果笔画总数大于50,打篮球天数+1
			}
		}
	}

	for(int y=2000;y<=2024;y+=4)//遍历所有的闰年
	{
        if(count(y)+count(2)+count(29)>50) ans++;//如果笔画总数大于50,打篮球天数+1
	}

	cout<<ans;//输出总数
	return 0;
}

int count(int x)//计算数字的笔画数
{
  int cnt=0,sum=0;
  while(x)
  {
    cnt++;//数字位数+1
    sum+=num[x%10];//数字当前最后一位的笔画数
    x/=10;
  }
  if(cnt<2) sum+=num[0];//手动补一个首位0
  return sum;
}

目前尚未有2024年第十四蓝桥杯软件C/C++大学B的真题解发布,因为该事的时间线可能还未到达公布阶段[^1]。然而,可以基于以往的比形式和内容推测其考察的知识点范围以及提供一些常见的练习方向。 以下是关于如何准备此类比的一些指导: ### 准备指南 #### 一、熟悉基础算法 掌握基本的数据结构和经典算法对于参者至关重要。这包括但不限于数、链表、栈、队列等数据结构的应用;排序(快速排序、归并排序)、查找(二分法)、动态规划等问题解决方法的学习实践。 ```cpp // 快速排序实现 (C++) void quickSort(int arr[], int low, int high){ if(low < high){ int pi = partition(arr,low,high); quickSort(arr, low, pi-1); quickSort(arr, pi+1, high); } } int partition (int arr[], int low, int high){ int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high- 1; j++){ if (arr[j] < pivot){ i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } ``` ```java // 快速排序实现 (Java) public static void quickSort(int[] array, int start, int end) { if(start >= end) return; int pivotIndex = partition(array, start, end); quickSort(array, start, pivotIndex - 1); quickSort(array, pivotIndex + 1, end); } private static int partition(int[] array, int start, int end) { int pivotValue = array[end]; int index = start; for(int i=start;i<end;i++) { if(array[i]<pivotValue) { swap(array,i,index++); } } swap(array,end,index); return index; } ``` #### 二、深入理解编程语言特性 无论是使用C++还是Java参加竞,都需要深入了解所选语言的特点及其标准库的功能。例如,在C++中熟练运用STL容器类如vector、map等能够极大提高编码效率;而在Java里,则需熟知Collections框架下的各类集合类型及其实现原理。 #### 三、模拟实战训练 通过历年试进行反复演练是非常有效的备考方式之一。虽然现在无法获取到最新的2024年具体目,但是可以通过分析往年的考来预测可能出现的新颖考点,并针对性加强薄弱环节。 --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值