第十四届蓝桥杯 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;
}
相关推荐
H Journey14 小时前
C++之 CMake、CMakeLists.txt、Makefile
开发语言·c++·makefile·cmake
研究点啥好呢18 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
_dindong18 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
沫璃染墨18 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
6Hzlia19 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
计算机安禾20 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
unicrom_深圳市由你创科技20 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
无限进步_20 小时前
【C++】电话号码的字母组合:从有限处理到通用解法
开发语言·c++·ide·windows·git·github·visual studio
计算机安禾20 小时前
【数据结构与算法】第35篇:归并排序与基数排序
c语言·数据结构·vscode·算法·排序算法·哈希算法·visual studio
C++ 老炮儿的技术栈20 小时前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt