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

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

文章目录

  • 第十四届蓝桥杯大赛软件赛省赛C/C++大学 B 组
    • 1、日期统计
    • 2、01串的熵
    • 3、冶炼金属
    • 4、飞机降落
    • 5、接龙数列
    • 6、岛屿个数
    • 7、子串简写
    • 8、整数删除
    • 9、景区导游
    • 10、砍树

1、日期统计

在这里插入图片描述
分析:

本题的意思就是2023年一整年,所有的日期,都用yyyymmdd表示,是否能从给出的数组中找到对应的数字。
已知2023不会再变,我们只需要枚举月份和天数即可。
因为是子序列所以我们也要按照顺序找对应数字。

代码分析:

#include<bits/stdc++.h>
using namespace std;
int a[105]; 
// 闰年是 29 天,平年是 28 天 
int d[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int sa[10];
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);for(int i=0;i<100;i++)cin>>a[i];int ans=0;for(int i=1;i<=12;i++){for(int j=1;j<=d[i];j++){int date[8]={2,0,2,3,i/10,i%10,j/10,j%10};int index=0;for(int k=0;k<100;k++){if(a[k]==date[index]){index++;if(index==8){ans++;break;}}} }}cout<<ans;return 0;
}

2、01串的熵

在这里插入图片描述
分析:

这一题要有数学思维,可以先表达式化简在进行计算。经过对对数的化简,我们求出x即可得到结果。

在这里插入图片描述
代码示例:

#include<bits/stdc++.h>
using namespace std;
double n=23333333;
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);double res=-(11625907.5798);for(int x=10;x<n+100000;x++){double num=pow(x,2)*(log2(x)-log2(n))+pow(n-x,2)*(log2(n-x)-log2(n));num/=n;if(num<=res){cout<<x;return 0;}}return 0;
}

3、冶炼金属

在这里插入图片描述
在这里插入图片描述
分析:

对于100%的数据,要满足到1e9所以我们要使用long long的数据类型。

示例代码:

#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
using ll = long long;
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);// A B V    B <= A/V < B+1  咱们是为了找到maxv,minv// 1/(B+1) < V/A <= 1/B// A/(B+1) < V <= A/Bint n;cin>>n;ll maxv=1e18,minv=0; for(int i=0;i<n;i++){ll a,b;cin>>a>>b;maxv=min(maxv,a/b);// 最大值是偏小的哪个 minv=max(minv,a/(b+1)+1);}cout<<minv<<" "<<maxv;return 0;
}

4、飞机降落

在这里插入图片描述
在这里插入图片描述

分析:

其实对于这一题,就是纯全排列问题,也就是说只要有一组方式满足题意即可。我们可以使用搜索来写,每一架飞机受到的影响都是前一架飞机降落的最晚时间。

示例代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 15;
struct node{int t,d,l;
}p[N];
int n;
bool vis[N];
bool dfs(int dep,int last){if(dep==n)return true;for(int i=0;i<n;i++){int t,d,l;t=p[i].t,d=p[i].d,l=p[i].l;if(!vis[i]&&last<=t+d){vis[i]=true;if(dfs(dep+1,max(last,t)+l))return true;vis[i]=false;}}return false;
}
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--){cin>>n;for(int i=0;i<n;i++){int t,d,l;cin>>t>>d>>l;p[i]={t,d,l};}memset(vis,0,sizeof(vis));if(dfs(0,0))cout<<"YES\n";else cout<<"NO\n";}return 0; 
}

5、接龙数列

在这里插入图片描述
分析:

动态规划的问题,题中问的是最少删除几个,我们可以得到接龙数列?那么我们就可以逆向思维,不妨找到最长的接龙数列ans,让n-ans。
我们可以设置状态dp[i]表示以i结尾的最长接龙数列。

代码示例:

#include<iostream>
#include<vector>
using namespace std;
int dp[15];// 表示以i结尾的最长接龙数列 
int n;
string s; 
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n;for(int i=0;i<n;i++){cin>>s;int l=s.size();// 这里就感觉非常像lis那种类型一样都是这样的动态规划dp[s[l-1]-'0']=max(dp[s[l-1]-'0'],dp[s[0]-'0']+1);}int maxn=0;for(int i=0;i<10;i++)maxn=max(maxn,dp[i]);cout<<n-maxn;return 0;
}

6、岛屿个数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析:
其实我们不需要遍历连通没有,我们要找的是岛屿的数量,只需要在外层加一层海洋,外层海洋可以涌入的地方,如果涌入的地方周围有陆地,那么这块陆地一定不在一个子岛屿中,反之,某个地方外层海洋无法涌入,一定是被某个环状岛屿包围所导致的,即位于某个子岛屿中。外层海洋无法涌入的地方,无需遍历。

从(0,0)处进行外层海洋的bfs,由于岛屿是上下左右四个方向的,那么外层海洋往里面渗入时需要从八个方向进行遍历。在进行外层海洋bfs时,如果遇到陆地了,那么说明所在的岛屿连通块需要被统计,此时进行岛屿的bfs。

代码示例:

#include<iostream>
#include<cstring>
#include<queue>
#define pii pair<int,int>
using namespace std;
int dx[8] = {1, -1, 0, 0, 1, -1, 1, -1};
int dy[8] = {0, 0, 1, -1, 1, -1, -1, 1};
const int N = 55;
char g[N][N];
bool vis[N][N];
int n, m, ans;
//岛屿BFS
void bfs(int sx, int sy){queue<pii> q;q.push({sx,sy});vis[sx][sy]=true;while(!q.empty()){pii d=q.front();q.pop();for(int k=0;k<4;k++){int nx=d.first+dx[k],ny=d.second+dy[k];if(nx<1||nx>n||ny<1||ny>m)continue;if(g[nx][ny]=='0'||vis[nx][ny])continue;q.push({nx,ny});vis[nx][ny]=true; }}
}
//外层海洋BFS
void bfs_sea(int sx, int sy){queue<pii> q;q.push({sx, sy});vis[sx][sy] = true;while(!q.empty()){pii d = q.front();q.pop();for(int k=0;k<8;k++ ){int nx=d.first+dx[k],ny=d.second+dy[k];if(nx<0||nx>n+1||ny<0||ny>m+1||vis[nx][ny])continue;if(g[nx][ny] == '1'){bfs(nx, ny);ans++; //如果遇到外层海水领近的陆地}else{q.push({nx,ny});vis[nx][ny]=true; }}}
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int t;cin>>t;while(t--){ans=0;cin>>n>>m;memset(vis,0,sizeof(vis));memset(g,'0',sizeof(g));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>g[i][j];bfs_sea(0,0);cout<<ans<<"\n";}return 0;
}

7、子串简写

在这里插入图片描述
在这里插入图片描述
分析:
我们可以看到数据规模是5e5,如果我们使用双指针遍历寻找的话,肯定超时只能的一部分分,我们就需要考虑优化过程,不让其两次循环遍历,我们就可以想到前缀和数组,去记录答案。
在这道题上,我们应该使用后缀和数组,nexsum[i] 表示的是在 i 的右边有 nextsum[i] 个 c2 字符,那么我们就可以用 nextsum[i+k-1] 直接得到符合题意的数量了。

示例代码:

#include<iostream>
using namespace std;
using ll = long long;
const int N = 5e5+5;
ll nextsum[N];
char c1,c2;
string s;
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int K;cin>>K;// j - i >= Kcin>>s>>c1>>c2;ll ans=0;for(int i=s.size()-1;i>=0;i--){nextsum[i]=nextsum[i+1];if(s[i]==c2){nextsum[i]++;}}for(int i=0;i<s.size();i++){if(s[i]==c1&&i+K-1<s.size()){ans+=nextsum[i+K-1];}}cout<<ans;return 0;
}

8、整数删除

在这里插入图片描述
在这里插入图片描述
分析:

其实我看到选择最靠前的最小值时,我就想到的优先队列来写,但是我又考虑到这个数的两边的都要加上这个被删除的值,所以如果用优先队列的话会不会破坏数据的顺序所以就用了vector来写,结果就是过了30%(O(n2)),其它的全部超时了。如果想要过掉全部数据就要使用优化的算法。

所以我们就要使用链表+优先队列去优化这个过程:
1、找出最小值(小根堆){ a[pos] , pos } -> pair<int,int>
2、找到最小值相邻的未被删除的数字

//1.没有优化的代码,超时
//#include<iostream>
//#include<vector>
//using namespace std;
//using ll = long long;
//vector<ll> a;
//int n,k,t;
//int getmin_index(){
//	int idx=0;
//	for(int i=1;i<t;i++){
//		if(a[i]<a[idx])idx=i;
//	}
//	return idx;//第一个最小值的下标 
//}
//int main(){
//	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
//	cin>>n>>k;
//	for(int i=0;i<n;i++){
//		ll num;cin>>num;
//		a.push_back(num);
//	}
//	t=n;
//	while(k--){
//		int index=getmin_index();
//		ll tmp=a[index];
//		if(index-1>=0)a[index-1]+=tmp;
//		if(index+1<=t)a[index+1]+=tmp;
//		a.erase(a.begin()+index);
//		t=a.size();
//	}
//	for(const auto& x:a)cout<<x<<" ";
//	return 0;
//}// 2.采用链表+堆优化这个过程
#include<iostream>
#include<queue>
using namespace std;
#define ll long long
#define pii pair<ll,ll>
const ll N = 5e5+10;
ll l[N],r[N],st[N];
// l[N] 表示i位置左边的位置
// r[N] 表示i位置右边的位置 
int n,k;
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>k;priority_queue<pii,vector<pii>,greater<pii>> q;for(ll i=0;i<n;i++){ll num;cin>>num;q.push({num,i});st[i]=num;l[i]=i-1;r[i]=i+1;if(r[i]==n)r[i]=-1;}while(k){pii p=q.top();q.pop();/*为什么这里要判断一下p.first!=st[p.second]呢?因为我们已经再下面将st[i]的值更新了,但是这个更新的值并没有重新应用到堆里面。所以我们需要更新这个值,而且哪个在堆里面没有更新的值已经pop掉了。所以不用担心重复增加问题。 */if(p.first!=st[p.second]){q.push({st[p.second],p.second});continue;}k--;ll pos = p.second;// l[i] r[i] 这个双向链表要仔细理解 if(l[pos]>=0)st[l[pos]]+=p.first;if(r[pos]>=0)st[r[pos]]+=p.first;if(l[pos]>=0)r[l[pos]]=r[pos];if(r[pos]>=0)l[r[pos]]=l[pos];st[pos]=-1;}for(ll i=0;i<n;i++){if(st[i]!=-1)cout<<st[i]<<' ';}return 0;
}

9、景区导游

在这里插入图片描述

在这里插入图片描述

分析:

看到路径的题,首先想到的就是最短路径算法dijkstra和floyd,我不太会dijkstra所以我用的floyd,对于此题,评测规模时1e5那么使用floyd必定超时或者空间不够,在此我只记录自己的写法。
我们可以先将所有的最短路径都预处理一下,此后我们就只需要进行枚举灭一个要走的景点即可。

暴力解法,只能通过30%:

#include<iostream>
#include<vector>
#include<algorithm> 
#define ll long long
using namespace std;
const ll N = 5e3+10,INF = 1e18;
ll d[N][N];
int n,m;
void floyd(){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(d[i][k]!=INF&&d[k][j]!=INF){d[i][j]=min(d[i][j],d[i][k]+d[k][j]);}}} 
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);for(int i=0;i<N;i++)for(int j=0;j<N;j++)d[i][j]=INF;cin>>n>>m;	for(int i=0;i<n-1;i++){int u,v,w;cin>>u>>v>>w;d[u][v]=d[v][u]=w;}vector<int> a;for(int i=0;i<m;i++){int nn;cin>>nn;a.push_back(nn);}floyd();for(int i=0;i<a.size();i++){int ans=0;vector<int> p(a.begin(),a.end());p.erase(p.begin()+i);for(int j=0;j<p.size()-1;j++){int u=p[j],v=p[j+1];ans+=d[u][v];}cout<<ans<<" ";}return 0;
} 

10、砍树

在这里插入图片描述

在这里插入图片描述

分析:

根据题意我们可以知道,就是一个有n-1条边的树,现在要求的是剪短一条边,会让所有的数对都不在连通的结果,问这个边的最大的编号是什么?
根据上面,我们知道剪短2和4都可以实现3-5,4-6不连通,但是4>2所以我们剪短2。
所以说这道题就是考察图的连通性的,所以我们可以使用搜索从编号大的向小的遍历看那个符合要求就输出,否则输出-1。

暴力解法,只能通过30%:

#include<iostream>
#include<vector>
#include<cstring>
#define ll long long
using namespace std;
const ll N = 1e5+10;
vector<pair<ll,ll>> g[N];// 前向星 
bool vis[N];
ll n,m,s[N],t[N];// (s[i],t[t]) 数对 
bool dfs(int s,int t,int id){if(s==t)return true;for(int i=0;i<g[s].size();i++){ll nxt=g[s][i].first,edgeId=g[s][i].second;if(edgeId==id)continue;//如果传进来的id等于要删除的边的编号则不走 if(vis[nxt])continue;vis[nxt]=1;if(dfs(nxt,t,id))return true;}return false;
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>m;for(int i=1;i<n;i++){int u,v;cin>>u>>v;// 邻接表 g[u].push_back({v,i});//u - v,记录这条边编号为 i g[v].push_back({u,i});}for(int i=1;i<=m;i++){cin>>s[i]>>t[i];}// 从编号大的向小的搜索 g[i]for(int i=n-1;i>=1;i--){bool flag=true;// 搜索每个数对 是否不连通  s[j] -> t[j] 如果搜不到即为成功 for(int j=1;j<=m;j++){memset(vis,0,sizeof(vis)); vis[s[j]]=1;if(dfs(s[j],t[j],i)){flag=false;break;}}if(flag){cout<<i;return 0;}}cout<<"-1";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++作业day4

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTime> #include <QTextToSpeech> #include <QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass…

技术分享 | Frida 实现 Hook 功能的强大能力

Frida 通过 C 语言将 QuickJS 注入到目标进程中&#xff0c;获取完整的内存操作权限&#xff0c;达到在程序运行时实时地插入额外代码和数据的目的。官方将调用代码封装为 python 库&#xff0c;当然你也可以直接通过其他的语言调用 Frida 中的 C 语言代码进行操作。 Frida安装…

【现代C++】线程支持库

现代C&#xff08;C11及其之后的版本&#xff09;引入了标准的线程支持库&#xff0c;使得多线程编程变得更加简单和可移植。这个库提供了线程管理、互斥量、条件变量和其他同步原语。 1. std::thread - 基本线程 std::thread允许创建执行特定任务的线程。 #include <ios…

【刷题】备战蓝桥杯 — dfs 算法

送给大家一句话&#xff1a; 风度真美&#xff01; 即使流泪&#xff0c;也要鼓掌&#xff0c; 即使失望&#xff0c;也要满怀希望。 ——刘宝增 dfs 算法 1 前言2 洛谷 P1030 [NOIP2001 普及组] 求先序排列题目描述算法思路 3 洛谷 P1294 高手去散步题目描述算法思路 4 蓝桥…

【数据结构】树与二叉树遍历算法的应用(求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子)

目录 求叶子节点个数、求树高、复制二叉树、创建二叉树、二叉树存放表达式、交换二叉树每个结点的左右孩子应用一&#xff1a;统计二叉树中叶子结点个数的算法写法一&#xff1a;使用静态变量写法二&#xff1a;传入 count 作为参数写法三&#xff1a;不使用额外变量 应用二&am…

Redis部署之主从

使用两台云服务器&#xff0c;在 Docker 下部署。 Redis版本为&#xff1a;7.2.4 下载并配置redis 配置文件 下载 wget -c http://download.redis.io/redis-stable/redis.conf配置 master节点配置 bind 0.0.0.0 # 使得Redis服务器可以跨网络访问,生产环境请考虑…

Linux 开发----在线英语字典

应用开发&#xff01; 这款应用程序是在Linux操作系统下完成的&#xff0c;整个项目包含了众多的知识点&#xff08;文件IO、进程、网络、数据库&#xff09;。动手操作之前可以先大致设计出流程图&#xff0c;然后根据流程图进行各个模块的实现&#xff08;注册模块、登录模块…

谈谈什么是 Redis

&#x1f525;博客主页&#xff1a;fly in the sky - CSDN博客 &#x1f680;欢迎各位&#xff1a;点赞&#x1f44d;收藏⭐️留言✍️&#x1f680; &#x1f386;慢品人间烟火色,闲观万事岁月长&#x1f386; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#…

RISC-V GNU Toolchain 工具链安装问题解决(stdio.h 问题解决,pk fence.i 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客&#xff1a;RSIC-V工具链介绍及其安装教程 - 风正豪 &#xff08;大佬的博客写的非常详细&#xff0c;唯一不足就是 sudo make linux -jxx 是全部小写。&#xff09; 工具链前前后后我装了…

【数据结构】-- 单链表 vs 双向链表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

动态规划刷题(2)之杨辉三角(详细解释)

最近在自学动态规划,网上到处找资料学习: 在这里记录我的刷题历史: 题目都是在力扣里面刷的!! 这里,我放一个刷动态规划的链接在这里:动态规划知识点题库 - 力扣(LeetCode) 力扣 在这里附加动态规划相关知识点:动态规划(DP)-CSDN博客文章浏览阅读197次。动态规划…

算法第四十一天-排除排序链表中的重复元素Ⅱ

排除排序链表中的重复元素Ⅱ 题目要求 解题思路 题意&#xff1a;在一个有序链表中&#xff0c;如果一个节点的值出现不止一次&#xff0c;那么把这个节点删除掉 重点&#xff1a;有序链表&#xff0c;所以&#xff0c;一个节点的值出现不止一次&#xff0c;那么他们必相邻。…

爬虫 新闻网站 以湖南法治报为例(含详细注释,控制台版) V2.0 升级自定义查询关键词、时间段

目标网站&#xff1a;湖南法治报 爬取目的&#xff1a;为了获取某一地区更全面的在湖南法治报已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&#xff0c;csv&#xff…

Redis-缓存击穿-逻辑过期

Redis-缓存击穿-逻辑过期实现 缓存击穿&#xff1a;也称热点key问题&#xff0c;大量访问一个key&#xff0c;而这个key恰巧到期了&#xff0c;导致大量的请求访问数据库。增大数据库的负担。为了解决这个问题可以采用互斥锁或逻辑过期的方式解决。本章采用逻辑过期的方式解决…

基于微信小程序的苏州博物馆文创产品售卖系统

前言 基于小程序的苏州博物馆文创产品售卖系统的设计与实现能够通过互联网得到广泛的、全面的宣传&#xff0c;让尽可能多的用户了解和熟知基于小程序的苏州博物馆文创产品售卖系统的设计与实现的便捷高效&#xff0c;不仅为群众提供了服务&#xff0c;而且也推广了自己&#…

【leetcode面试经典150题】37. 矩阵置零(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

堆 和 优先级队列

目录 一、堆 二、优先级队列 1、初识优先级队列 2、实现一个优先级队列 3、PriorityQueue &#xff08;1&#xff09;实现了Comparable接口&#xff0c;重写了compareTo方法 &#xff08;2&#xff09;实现了Comparator接口&#xff0c;重写了compare方法 4、 Prio…

Django+Celery框架自动化定时任务开发

本章介绍使用DjCelery即DjangoCelery框架开发定时任务功能&#xff0c;在Autotestplat平台上实现单一接口自动化测试脚本、业务场景接口自动化测试脚本、App自动化测试脚本、Web自动化测试脚本等任务的定时执行、调度、管理等&#xff0c;从而取代Jenkins上的定时执行脚本和发送…

windows安装Redis,Mongo,ES并快速基本掌握开发流程

前言 这里只是一些安装后的基础操作&#xff0c;后期会学习更加深入的操作 基础操作 前言RedisRedis启动idea集成Redisjedis技术 Mongodbwindows版Mongodb的安装idea整合Mongodb ES(Elasticsearch)ESwindows下载ES文档操作idea整合ES低级别ES整合高级别ES整合 Redis Redis是…

深入理解JVM后端优化技术-方法内联

相关系列 深入理解JVM后端优化技术-逃逸分析(Escape Analysis)-CSDN博客 深入理解JVM后端优化技术-锁消除&#xff08;Lock Elision)-CSDN博客 深入理解JVM后端优化技术-锁粗化(Lock Coarsening)-CSDN博客 jvm只是负责依次将字节码指令逐次转换成机器码。而在转换过程中&#x…