第十四届蓝桥杯 2023 C/C++组 日期统计

目录

题目:

题目描述:

题目链接:

思路:

核心思路:

思路详解:

set容器去重的原理:

代码:

代码详解:


题目:

题目描述:

题目链接:

日期统计

思路:

核心思路:

暴力优化+set去重

思路详解:

第一想法是暴力枚举,但是如果纯暴力枚举的话8个for循环嵌套还是很吓人的。由题找到的日期前四位都是2023,所以优化我们可以对前四位的每一位进行提前剪枝优化。再观察题目,题目特地把"不同"这两个字标黑,说明从前往后遍历可能存在相同的日期。为了达到相同的日期只统计一次,我们可以利用set容器去重

set容器去重的原理:

自动去重是set容器的特性,使用insert向容器set插入元素,insert会返回一个pair对象,其中first是一个迭代器,指向插入的元素(已经插入成功)或者已经存在的相同元素,second是一个布尔值,表示插入是否成功 eg:第一次插入"20230101"时insert会成功插入并返回true,第二次插入相同元素时,由于set中不允许有重复元素,插入会失败,返回false

代码:

代码详解:

复制代码
#include<bits/stdc++.h> //这题给我一个教训就是暴力枚举也不是无脑暴力,像这题8个for循环,如果像我一 
using namespace std;    //开始那样把if全放到最内层的for里,运行时间过长看不到输出结果很搞心态
//因为肯定希望看到输出结果再来debug,一直看不到输出结果也不知道是还没运行完还是哪里语法出了错误
//这题是填空题,所以没有时间限制,能跑出答案就行,正确地在暴力过程中优化才能快速的输出结果
//一开始我把全部的if都放到了最内层的for中,由于没有提前终止条件,嵌套循环会尝试所有可能的组合,这可
//能会导致程序运行时间过长甚至看起来像是没有输出,实际上可能是由于计算量过大程序仍在运行中 
//通过多次设置提前终止条件,实际上235的输出结果的运行时间为1.1s左右,一开始甚至很久跑不出结果 

int ans;                                                   //显然2023年不是闰年 
int daysofmonth[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //month从1开始,所以dayofmonth[0]=0 
set<string> valid_dates;  //使用set容器来存储合法的日期字符串,利用set的特性自动去重 

int main()
{
	string s="5686916124919823647759503875815861830379270588570991944686338516346707827689565614010094809128502533";
	for(int a=0;a<100;a++)
	{
		if(s[a]!='2')  //设置提前终止条件 
		{
			continue;  //如果第一个字符不是'2'就结束当前循环,a++进入下一个循环 
		}
		for(int b=a+1;b<100;b++)
		{
			if(s[b]!='0')  //同理 
			{
				continue;
			}
			for(int c=b+1;c<100;c++)
			{
				if(s[c]!='2')  //同理 
				{
					continue;
				}
				for(int d=c+1;d<100;d++)
				{
					if(s[d]!='3')  //同理 
					{
						continue;
					}
					for(int e=d+1;e<100;e++)
					{
						for(int f=e+1;f<100;f++)
						{
							int month=(s[e]-'0')*10+(s[f]-'0'); //定义month,用s[e]和s[f]来计算 
							if(month<1||month>12) //上面定义month就是为了这里更简洁 
							{
								continue;
							}
							for(int g=f+1;g<100;g++)
							{
								for(int h=g+1;h<100;h++)
								{
									int day=(s[g]-'0')*10+(s[h]-'0'); //定义day,用s[g]和s[e]来计算 
									if(day>=1&&day<=daysofmonth[month]) //定义day更简洁 
									{
										string date="2023"+string(1,s[e])+string(1,s[f])+string(1,s[g])+string(1,s[h]);
										valid_dates.insert(date);
//使用insert向容器set插入元素,insert会返回一个pair对象,其中first是一个迭代器,指向插入的元素(已经
//插入成功)或者已经存在的相同元素,second是一个布尔值,表示插入是否成功  eg:第一次插入"20230101"时
//insert会成功插入并返回true,第二次插入相同元素时,由于set中不允许有重复元素,插入会失败,返回false 
									}
								}
							}
						}
					}
				}
			}
		}
	}
	cout<<valid_dates.size()<<endl;  //使用size方法获取set中元素的数量 
	return 0;
}
相关推荐
RuoZoe1 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
blasit2 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_3 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星3 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛5 天前
delete又未完全delete
c++
祈安_5 天前
C语言内存函数
c语言·后端
端平入洛6 天前
auto有时不auto
c++
norlan_jame6 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20216 天前
信号量和信号
linux·c++
多恩Stone6 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc