第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

试题 A: 日期统计
本题总分: 5
【问题描述】
小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 9
范围之内。数组中的元素从左至右如下所示:
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
现在他想要从这个数组中寻找一些满足以下条件的子序列:
1. 子序列的长度为 8
2. 这个子序列可以按照下标顺序组成一个 yyyymmdd 格式的日期,并且
要求这个日期是 2023 年中的某一天的日期,例如 20230902 20231223
yyyy 表示年份, mm 表示月份, dd 表示天数,当月份或者天数的长度只
有一位时需要一个前导零补充。
请你帮小蓝计算下按上述条件一共能找到多少个 不同 2023 年的日期。
对于相同的日期你只需要统计一次即可。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
8层循环,set去重
答案:235
#include<bits/stdc++.h>
using namespace std;
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},t;
int a[101];
set<int> line;
void f(int n){
	for(int i=n+1;i<100;i++){
		for(int j=i+1;j<100;j++){
			if(a[i]*10+a[j]>=1&&a[i]*10+a[j]<=12)
			for(int x=j+1;x<100;x++){
				for(int y=x+1;y<100;y++){
					t=a[i]*10+a[j];
					if(a[x]*10+a[y]>=1&&a[x]*10+a[y]<=m[t]){
						line.insert(t*100+a[x]*10+a[y]);
					}
				}
			}	
		}
	}
	
}
int main(){
	
	for(int i=0;i<100;i++)
	cin>>a[i];
	for(int i=0;i<100;i++){
		if(a[i]==2)
		for(int j=i+1;j<100;j++)
		if(a[j]==0)
			for(int x=j+1;x<100;x++)
			if(a[x]==2)
				for(int y=x+1;y<100;y++)
					if(a[y]==3){
					f(y);
		}
	} cout<<line.size();
	return 0;
}

试题 B: 01 串的熵

看不懂,没做出来(更新)

用表格单变量求解

试题 C: 冶炼金属
解答:
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,a,b,max1=0,min1=0x3f3f3f3f;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a>>b;
		min1=min(min1,a/b);
		max1=max(max1,a%(b+1)?a/(b+1)+1:a/(b+1));
	} 
	cout<<max1<<' '<<min1;
	return 0;
}
试题 D: 飞机降落
个人思路,先按照最迟降落时刻排序,再按顺序计算前一架飞机降落时间和后一架飞机最迟降落时刻比较,冲突则跳出循环,输出‘NO’
试题 E: 接龙数列
感觉要用到dp来记录最少删除个数,不会,比赛时按输入顺序与后一个数比较,记录不同的数个数
试题 F: 岛屿个数
感觉要用dfs搜索岛屿,还有判断是否成环,岛屿是否是子岛屿
试题 G: 子串简写
在oj上运行了一下没有过全部样例
#include<bits/stdc++.h>
using namespace std;
long long t;
int main(){
	int k;
	cin>>k;
	string s;
	char c1,c2;
	cin>>s>>c1>>c2;
	for(int i=0;i<s.length()-k+1;i++){
		if(s[i]==c1)
		for(int j=i+k-1;j<s.length();j++){
			if(s[j]==c2){
				t++;
			}
		}
	}
	cout<<t;
	return 0;
}
试题 H: 整数删除
直播说要用到堆,但我不会,比赛时是循环记录每次删除的数字位置,再两边数字加上被删数字,再循环将被删的数字后的数字前移,数组长度减一,样例跑出来了,估计会超时
#include<bits/stdc++.h>
using namespace std;
long long t;
int main(){
	int n,k;
	cin>>n>>k;
	int a[n],min1=0x3f3f3f3f;
	for(int i=0;i<n;i++)
		cin>>a[i];
	for(int i=0;i<k;i++){
		t=0;
		min1=0x3f3f3f3f;
		for(int j=0;j<n;j++){
			t=a[j]<min1?j:t;
			min1=min(min1,a[j]);
		}
		a[t-1]+=a[t];
		a[t+1]+=a[t];
		for(int i=t;i<n-1;i++){
			a[i]=a[i+1];
		}
		n--;
	}
	for(int i=0;i<n;i++)
	cout<<a[i]<<' ';
	return 0;
}
试题 I: 景区导游
图论最短路迪杰斯特拉算法或弗洛伊德算法(更新)lca算法最近公共祖先
试题 J: 砍树
并查集?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值