2023第十四届蓝桥杯c++ b组省赛真题

2023-11-07

1.冶炼金属

题目描述

小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金

属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续冶炼。

现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。每条记录都是独立

的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。

根据这 N 条冶炼记录,请你推测出转换率 V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。

输入格式

第一行一个整数 N,表示冶炼记录的数目。

接下来输入 N 行,每行两个整数 A、B,含义如题目所述。

输出格式

输出两个整数,分别表示 V 可能的最小值和最大值,中间用空格分开。

样例输入

3

75 3

53 2

59 2

 

样例输出

20 25

提示

当 V = 20 时,有:⌊75/20⌋ = 3,⌊ 53/20 ⌋ = 2,⌊ 59/20 ⌋ = 2,可以看到符合所有冶炼记录。

当 V = 25 时,有:⌊75/25⌋ = 3,⌊ 53/25 ⌋ = 2,⌊ 59/25 ⌋ = 2,可以看到符合所有冶炼记录。

且再也找不到比 20 更小或者比 25 更大的符合条件的 V 值了。

对于 30% 的评测用例,1 ≤ N ≤ 10^2。

对于 60% 的评测用例,1 ≤ N ≤ 10^3。

对于 100% 的评测用例,1 ≤ N ≤ 10^4,1 ≤ B ≤ A ≤ 10^9。

思维题

直接上代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,a,b=1e9+10;
int main(){
	cin>>n;
	while(n--){
		int x,y;
		cin>>x>>y;
		b=min(b,x/y);
		a=max(a,x/(y+1));
	}
	cout<<a+1<<" "<<b;
	return 0;
}

2.飞机降落(dfs+回溯+剪枝)

题目描述

N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早

可以于 Ti 时刻开始降落,最晚可以于 Ti + Di 时刻开始降落。降落过程需要 Li个单位时间。

一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。

请你判断 N 架飞机是否可以全部安全降落。

输入格式

输入包含多组数据。

第一行包含一个整数 T,代表测试数据的组数。

对于每组数据,第一行包含一个整数 N。

以下 N 行,每行包含三个整数:Ti,Di 和 Li。

输出格式

对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。

样例输入

2

3

0 100 10

10 10 10

0 2 20

3

0 10 20

10 10 20

20 10 20

 

样例输出

YES
NO

提示

对于第一组数据,可以安排第 3 架飞机于 0 时刻开始降落,20 时刻完成降落。安排第 2 架飞机于 20 时刻开始降落,30 时刻完成降落。安排第 1 架飞机于 30 时刻开始降落,40 时刻完成降落。

对于第二组数据,无论如何安排,都会有飞机不能及时降落。

对于 30% 的数据,N ≤ 2。

对于 100% 的数据,1 ≤ T ≤ 10,1 ≤ N ≤ 10,0 ≤ Ti , Di , Li ≤ 10^5。

解题思路

一看数据范围就是搜索,10的阶乘为3628800算上10组数据刚好可以过。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,T,res;
struct stu{
	int x;
	int y;
	int z;
};
stu a[15];
bool st[15];
int t[15];
bool check(){
	int k=a[t[1]].x+a[t[1]].z;
	for(int i=2;i<=n;i++){
		if(a[t[i]].x+a[t[i]].y<k) return 0;
		else {
			if(k>=a[t[i]].x) k+=a[t[i]].z;
			else k+=(a[t[i]].x-k+a[t[i]].z);
		}
	}
	return 1;
}
void dfs(int u){
	if(u>n){
		if(check()) res++;
		return ;
	}
	if(res) return;
	for(int i=1;i<=n;i++){
		if(!st[i]){
			t[u]=i;
			st[i]=1;
			dfs(u+1);
			st[i]=0;
		}
	}
}
int main(){
	cin>>T;
	while(T--){
		cin>>n;
		res=0;
		memset(st,0,sizeof st);
		for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y>>a[i].z;
		dfs(1);
		if(res) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

3.接龙数列(线性dp)

题目描述

对于一个长度为 K 的整数数列:A1, A2, . . . , AK,我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1 的末位数字 (2 ≤ i ≤ K)。

例如 12, 23, 35, 56, 61, 11 是接龙数列;12, 23, 34, 56 不是接龙数列,因为 56的首位数字不等于 34 的末位数字。所有长度为 1 的整数数列都是接龙数列。

现在给定一个长度为 N 的数列 A1, A2, . . . , AN,请你计算最少从中删除多少个数,可以使剩下的序列是接龙序列?

输入格式

第一行包含一个整数 N。

第二行包含 N 个整数 A1, A2, . . . , AN。

输出格式

一个整数代表答案。

样例输入

5

11 121 22 12 2023

 

样例输出

1

提示

删除 22,剩余 11, 121, 12, 2023 是接龙数列。

对于 20% 的数据,1 ≤ N ≤ 20。

对于 50% 的数据,1 ≤ N ≤ 10000。

对于 100% 的数据,1 ≤ N ≤ 10^5,1 ≤ Ai ≤ 10^9。所有 Ai 保证不包含前导 0。

解题思路

最长上升子序列模型,f[r]表示以r结尾的最长接龙子序列的长度,则f[r]=max(f[r],f[l]+1)

答案是n减去最长接龙子序列的长度

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,t,res;
const int N=1e5+10;
int f[N],a[N];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		int t=a[i],l;
		int r=t%10;
		while(t){
			l=t;
			t/=10;
		}
		f[r]=max(f[r],f[l]+1);
		res=max(res,f[r]);
	}
	cout<<n-res;
	return 0;
}

4.子串简写(思维+二分)

题目描述

程序猿圈子里正在流行一种很新的简写方法:对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。例如 internation-alization 简写成 i18n,Kubernetes (注意连字符不是字符串的一部分)简写成 K8s, Lanqiao 简写成 L5o 等。

在本题中,我们规定长度大于等于 K 的字符串都可以采用这种简写方法(长度小于 K 的字符串不配使用这种简写)。

给定一个字符串 S 和两个字符 c1 和 c2,请你计算 S 有多少个以 c1 开头c2 结尾的子串可以采用这种简写?

输入格式

第一行包含一个整数 K。

第二行包含一个字符串 S 和两个字符 c1 和 c2。

输出格式

一个整数代表答案。

样例输入

4 
abababdb a b

样例输出

6

提示

符合条件的子串如下所示,中括号内是该子串:

[abab]abdb

[ababab]db

[abababdb]

ab[abab]db

ab[ababdb]

abab[abdb]

对于 20% 的数据,2 ≤ K ≤ |S | ≤ 10000。

对于 100% 的数据,2 ≤ K ≤ |S | ≤ 5 × 10^5。S 只包含小写字母。c1 和 c2 都是小写字母。

|S | 代表字符串 S 的长度。

解题思路

先把所有c1,c2的下表分别存起来,然后主要根据两个数组的单调性来优化算法(二分,思维)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,k,res;
string str;
char a,b;
vector<int> x;
vector<int> y;
int main(){
	cin>>k;
	cin>>str>>a>>b;
	n=str.size();
	for(int i=0;i<n;i++){
		if(str[i]==a) x.push_back(i);
		if(str[i]==b) y.push_back(i);
	}
	int n1=x.size(),n2=y.size();
	for(int i=0;i<n1;i++){
		int l=0,r=n2-1;
		while(l<r){
			int mid=l+r>>1;
			if(y[mid]-x[i]+1>=k) r=mid;
			else l=mid+1;
		}
		if(y[l]-x[i]+1>=k) res+=(n2-l);
	}
	cout<<res;
	return 0;
}
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string str;
int k;
ll res;
const int N=5e5+10;
int f[N];
char a,b;
int main(){
	cin>>k;
	cin>>str;
	cin>>a>>b;
	int n=str.size();
	for(int i=k-1;i<n;i++){
		if(str[i-k+1]==a) f[i]=f[i-1]+1;
		else f[i]=f[i-1];
	}
	for(int i=k-1;i<n;i++){
		if(str[i]==b) res+=f[i];
	}
	cout<<res;
	return 0;
}

5.整数删除(优先队列+双向链表)

题目描述

给定一个长度为 N 的整数数列:A1, A2, . . . , AN。你要重复以下操作 K 次:

每次选择数列中最小的整数(如果最小值不止一个,选择最靠前的),将其删除。并把与它相邻的整数加上被删除的数值。

输出 K 次操作后的序列。

输入格式

第一行包含两个整数 N 和 K。

第二行包含 N 个整数,A1, A2, A3, . . . , AN。

输出格式

输出 N − K 个整数,中间用一个空格隔开,代表 K 次操作后的序列。

样例输入

5 3 
1 4 2 8 7

样例输出

17 7

提示

数列变化如下,中括号里的数是当次操作中被选择的数:

[1] 4 2 8 7

5 [2] 8 7

[7] 10 7

17 7

对于 20% 的数据,1 ≤ K < N ≤ 10000。

对于 100% 的数据,1 ≤ K < N ≤ 5 × 10^5,0 ≤ Ai ≤ 10^8。

解题思路

首先看时间复杂度删除操作必须是O(1)很容易想到双向链表,然后每次取最小元素可以用小根堆来实现。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+10;
ll l[N],r[N],v[N];
int n,k;
typedef pair<ll,int> PII;
void del(int x){
	r[l[x]]=r[x];l[r[x]]=l[x];
	v[l[x]]+=v[x];v[r[x]]+=v[x];
}
int main(){
	cin>>n>>k;
	l[n+1]=n;r[0]=1;
	priority_queue<PII,vector<PII>,greater<PII>> q; 
	for(int i=1;i<=n;i++){
		cin>>v[i];
		l[i]=i-1;
		r[i]=i+1;
		q.push({v[i],i});
	}
	while(k--){
		auto t=q.top();
		q.pop();
		if(t.first!=v[t.second]) q.push({v[t.second],t.second}),k++;
		else del(t.second);
	}
	int head=r[0];
	while(head&&head<=n){
		cout<<v[head]<<" ";
		head=r[head];
	}
	return 0;
}

目前就会这几道,其他的学会再补更,总而言之这次蓝桥杯b组比去年都难度要大一些,写暴力拿不了太多分,题的质量很高,考察的也很精细,而且易错点也不少,在考试的紧张环境下很难把会做的都ac,所以以后准备蓝桥杯一定要刷难度稍微大一点的题,因为趋势是就是难度逐年递增。

最后祝各位大佬都省一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2023第十四届蓝桥杯c++ b组省赛真题 的相关文章

随机推荐

  • 自我理解:精度(precision)和召回(recall)

    1 精度 precision 精度是用于评估分类模型的一个重要指标 它反映了模型预测为正例的样本中 实际真正为正例样本的比例 注 正例样本指在二分类问题中 被标注为正类的样本 例如 在垃圾邮件分类任务中 正例样本就是真实的垃圾邮件 精度的计
  • 大学生团体天梯赛(第三届)

    题目地址 天梯赛 include
  • 树莓派LINUX内核移植

    参考博文 https editor csdn net md not checkout 1 articleId 109006969 树莓派linux内核下载地址 https github com raspberryPi 需要下载内核的版本可以
  • Hadoop的搭建,VmwareWorkstation 16pro + Ubuntu18.04.1

    文章目录 前言 一 VmwareWorkstation 16pro安装Ubuntu18 04 1 二 Ubuntu的基础配置 1 设置国内镜像源 2 下载安装Vmware Tools 三 安装Hadoop 总结 前言 Hadoop的搭建过程
  • PyQt编程实战:画出QScrollArea的scrollAreaWidgetContents内容部署层的范围矩形

    老猿Python博文目录 专栏 使用PyQt开发图形界面Python应用 老猿Python博客地址 一 引言 在 PyQt Python Qt 学习随笔 QScrollArea滚动区域详解 介绍了滚动区域的展现层 也称框架层 和内容部署层
  • python的格式化输出

    python格式化输出 被称为格式化操作符 专门用于处理字符串中的格式 包含 的字符串 被称为格式化字符串 和不同的字符串连用 不同类型的数据 需要使用不同的格式化字符 格式化字符 含义 s 字符串 d 有符号十进制整数 06d不是输出的整
  • iOS开发之 __block 与 __weak的区别理解

    资料来源1 资料来源2 block对象在block中是可以被修改 重新赋值的 使用了 weak修饰符的对象 作用等同于定义为weak的property 自然不会导致循环引用问题 因为苹果文档已经说的很清楚 当原对象没有任何强引用的时候 弱引
  • Springboot 启动过程二

    用于源码分析的代码 Github 接着启动过程一中的代码 继续debug 这一篇主要看new SpringApplication primarySources 的代码 首先还是列出问题 带着问题去看源码收获也会多些 待解答的问题 这段代码的
  • 【vcruntime140.dll文件下载】vcruntime140.dll丢失的解决方法

    vcruntime140 dll文件对一些电脑软件 电脑游戏等程序的正常运行起到关键性作用 对于弹出缺少此类文件的弹窗 用户们很多时候也摸不着头脑 程序明明上次都能正常运行 突然就弹出缺少vcruntime140 dll文件的提醒窗口 通过
  • 最详细、最仔细、最清晰的几道python习题及答案(建议收藏哦)

    名字 阿玥的小东东 学习 python c 主页 没了 今天阿玥带大家来看看更详细的python的练习题 目录 1 在python中 list tuple dict set有什么区别 主要应用在什么样的场景
  • 玩转Nginx日志

    目录标题 Nginx日志 nginx conf nginx日志切割 2 设置linux定时任务 Nginx日志 nginx conf user nobody worker processes 1 error log logs error l
  • QT------常用控件:qtlistwidget和qtlistview

    qtlistwidget和qtlistview都是用于在界面成行 成列的显示数据的 两者的区别在于 1 qtlistview可以用使用model 更便于动态添加数据 而qtlistwidget只能一条一条的增加列表项进行显示数据 使用QSt
  • 简易的学生管理系统

    文章目录 前言 一 代码 二 展示结果 1 主界面 2 输入记录 3 插入数据 4 删除数据 5 成绩排序 总结 前言 本文在链表前篇之数组的基础上写的一个简易的学生管理系统 本着练手感的目的去写的一个代码 并不是很完美 代码仅供参考 话不
  • 通过浏览器检测硬件 —— 筑梦之路

    在线硬件检测工具 测试网址1 主要检测显卡显示效果 volumeshader bm 测试网址2 可以检测cpu GPU 屏幕等精大师在线显卡测试 首页 网页版GPU性能测试工具
  • h5跳转到 苹果 ios app store 应用商店 的APP详情页面

    在开发 h5跳转到 ios系统 app store的时候遇到两个问题 原理 判断是安卓还是苹果 如果为苹果显示苹果的标签 点击a标签 执行跳转唤起APP openAPP 加一个定时器 三秒 可根据需求调整 之后 如果没有唤起成功 跳转到Ap
  • Java项目:网上图书馆管理系统(java+jsp+servlert+mysql+ajax)

    源码获取 博客首页 资源 里下载 一 项目简述 功能 区分为管理员用户和普通用户 普通用户 用户登录 个 人信息修改 图书查询 用户借阅 用户归还 管理员用 户 图书馆里 归还管理 借阅信息查询 图书维护 分 类管理 读者管理等等功能 二
  • 服务器控制口协议,服务器管理ipmi接口协议的扩展方法 Extension Methods server management interface protocol ipmi...

    摘要 The invention provides an extension method for managing an IPMI Intelligent Platform Management Interface interface p
  • eclipse中配置Tomcat

    将Tomcat服务器整合到Eclipse工具中 可以通过Eclipse启动 关闭tomcat服务器 更重要的是 可以非常方便的将在Eclipse中创建的Web项目发布到Tomcat服务器中运行 文章目录 在这里插入图片描述 方式一 在win
  • ubuntu20.04安装和卸载gtsam

    安装boost Boost gt 1 43 Ubuntu sudo apt get install libboost all dev 安装cmake CMake gt 3 0 Ubuntu sudo apt get install cmak
  • 2023第十四届蓝桥杯c++ b组省赛真题

    1 冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X 这个炉子有一个称作转换率的属性 V V 是一个正整数 这意味着消耗 V 个普通金 属 O 恰好可以冶炼出一个特殊金属 X 当普通金属 O 的数目不足