首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >蓝桥杯:日期统计

蓝桥杯:日期统计

作者头像
用户11290664
发布2025-04-09 08:26:32
发布2025-04-09 08:26:32
1670
举报
文章被收录于专栏:学习学习

问题描述

首先我们要了解什么是子序列,就是一个序列之中可以忽略元素但是不能改变顺序之后获得的序列就叫做子序列。 如"123"就是"11234"的子序列而不是"11324"的子序列

解法一递归

代码语言:javascript
复制
#include <iostream>
#include<vector>
#include<algorithm>
#include<list>
#include<map>
#include<set>
#include<queue>
#include<string>
bool vis[202400000];
int pp[100] = {
		5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7,
		5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9,
		2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3,
		8, 5, 1, 6, 3, 4, 6, 7, 0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6,
		1, 4, 0, 1, 0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3
};
using namespace std;
int ans = 0;
bool checkd(int date) {
	if (vis[date])return false;
	vis[date] = 1;
	int date1 = date / 100%100;
	int date2 = date % 100;
	if (date1 > 12 || date1 < 1)return false;
	if (date1 == 1 || date1 == 3 || date1 == 5 || date1 == 7 || date1 == 8 || date1 == 10 || date1 == 12) {
		if (date2 <= 31 && date2 >= 1)return true;
	}
	else if (date1 == 2) {
		if (date2 <= 28&& date2 >= 1)return true;
	}
	else {
		if (date2 <= 30 && date2 >= 1)return true;
	}
	return false;
}
void dfs(int pos, int k, int date) {
	if (k == 8) {
		if (checkd(date)) {

			ans++;
		};
		return;
	}
	if (pos > 99) {
		return;
	}
	if (pp[pos] == 2 && k == 0 || pp[pos] == 0 && k == 1 || pp[pos] == 2 && k == 2 || pp[pos] == 3 && k == 3 ||
		pp[pos] <= 1 && k == 4 || pp[pos] <= 9 && k == 5 || pp[pos] <= 3 && k == 6 || pp[pos] <= 9 && k == 7)
	{
		dfs(pos + 1, k + 1, date * 10 + pp[pos]);
	}

	dfs(pos + 1, k, date);
}
int main()
{
	

	dfs(0, 0, 0);
	cout << ans;
	return 0;
}

首先我们创建函数dfs(),pos代表数组位置,k代表位数,date表示当前的日期,其中date * 10 + pp[pos]是保存当前日期,我们迭代到位数k==8 return但是要检查date是否合法

因为date有可能出现13,14之类的写一个checkd函数如果查到合法ans++,bool vis是检查日期是否重复的函数。 完成这一位搜索之后dfs(pos + 1, k, date);,直到pos>99 return

解法二:暴力破解

解法二直接穷举2023所有的日期,看序列中有没有,这样就不要判断重复,也不用判断是否合法,直接从第一个位置到最后一个位置,输出ans就可以,代码也会少很多

代码语言:javascript
复制
#include <bits/stdc++.h>
#include<string>
#include<vector> 
using namespace std;


int main()
{
	int day[] = { 1,31,28,31,30,31,30,31,31,30,31,30,31 };

	int ans = 0;
	int arr[100] = {
		5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7,
		5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9,
		2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3,
		8, 5, 1, 6, 3, 4, 6, 7, 0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6,
		1, 4, 0, 1, 0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3
	};

	for (int i = 1; i <= 12; i++) {
		for (int j = 1; j <= day[i]; j++) {
			int date[] = { 1,2,0,2,3,i / 10,i % 10,j / 10,j % 10 };

			int	id = 1;
			for (int c = 0; c < 100; c++)
			{


				if (arr[c] == date[id]) {
					id++;
				}
				if (id > 8) {
					ans++;

					break;
				}
			}

		}
	}
	cout << ans;
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 解法一递归
  • 解法二:暴力破解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档