欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 蓝桥杯:日期统计

蓝桥杯:日期统计

2025/4/15 21:44:32 来源:https://blog.csdn.net/jjj_mmm/article/details/147077316  浏览:    关键词:蓝桥杯:日期统计

文章目录

  • 问题描述
  • 解法一递归
  • 解法二:暴力破解

问题描述

在这里插入图片描述

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

解法一递归

#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就可以,代码也会少很多


#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;
}

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词