2024算法基础公选课练习八(综合4)

一、前言

前面几个题都是考察字符串处理,后面的都是偏难的思维和图论题

二、题目总览

三、具体题目

3.1 问题 A: 昊城的分割游戏

思路

枚举前几项,然后发现规律

我的代码

#include<bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using pii = std::pair<int,int>;
constexpr int N = 1e5+5,M = 1e6+5,INF = 0x3f3f3f3f;
#define pb emplace_back
#define all(v) v.begin(),v.end()/*
1 => 1
1 2 => 1
1 2 3 => 0
1 2 3 4 => 1
1 2 3 4 5 => 1
1 2 3 4 5 6 => 1
1 2 3 4 5 6 7 => 0
1 2 3 4 5 6 7 8 => 0
1 ... 9 => 1
*/void solve(){int n;std::cin >> n;std::cout << (n%4==1||n%4==2?1:0) << '\n';
}int main(){std::cin.tie(nullptr)->sync_with_stdio(false);int tt = 1;// std::cin >> tt;for(int ti = 0;ti<tt;++ti){solve();}return 0;
}

3.2 问题 B: 盲兔打字

思路

分左右,注意边界不能越出

我的代码

#include<bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using pii = std::pair<int,int>;
constexpr int N = 1e5+5,M = 1e6+5,INF = 0x3f3f3f3f;
#define pb emplace_back
#define all(v) v.begin(),v.end()
/*
qwertyuiop
asdfghjkl;
zxcvbnm,./ 
*/
void solve(){std::string line1 = "qwertyuiop";std::string line2 = "asdfghjkl;";std::string line3 = "zxcvbnm,./";std::string dir;std::cin >> dir;std::string s;std::cin >> s;std::string ans;if(dir=="R"){for(const auto& c:s){int pos;if((pos =line1.find(c))!=std::string::npos){if(pos!=0){ans+=line1[pos-1];}else{ans+=line1[pos];}}else if((pos =line2.find(c))!=std::string::npos){if(pos!=0){ans+=line2[pos-1];}else{ans+=line2[pos];}}else if((pos =line3.find(c))!=std::string::npos){if(pos!=0){ans+=line3[pos-1];}else{ans+=line3[pos];}}}}else{//dir=="L"for(const auto& c:s){int pos;if((pos =line1.find(c))!=std::string::npos){if(pos!=line1.size()-1){ans+=line1[pos+1];}else{ans+=line1[pos];}}else if((pos =line2.find(c))!=std::string::npos){if(pos!=line2.size()-1){ans+=line2[pos+1];}else{ans+=line2[pos];}}else if((pos =line3.find(c))!=std::string::npos){if(pos!=line3.size()-1){ans+=line3[pos+1];}else{ans+=line3[pos];}}}}std::cout << ans << '\n';
}int main(){std::cin.tie(nullptr)->sync_with_stdio(false);int tt = 1;// std::cin >> tt;for(int ti = 0;ti<tt;++ti){solve();}return 0;
}

3.3 问题 C: 兔兔的故障键盘

思路

根据题意,枚举'a'到'z'每一个字母,如果有出现字母连续出现的次数为奇数,那么这个字符一定没有故障,如果连续出现次数为偶数,则无法判断这个字母是否出现故障

我的代码

#include<bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using pii = std::pair<int,int>;
constexpr int N = 1e5+5,M = 1e6+5,INF = 0x3f3f3f3f;
#define pb emplace_back
#define all(v) v.begin(),v.end()void solve(){std::vector<char> ans;std::string s;std::cin >> s;for(char c = 'a';c<='z';++c){bool flag = false;int cnt = 0;for(int i = 0;i<s.size();++i){if(s[i]==c){if(!flag) flag = true;++cnt;}else{if(cnt&1){ans.pb(c);break;}flag = false;cnt = 0;}}if(flag&&cnt&1){ans.pb(c);}}std::sort(all(ans));ans.erase(std::unique(all(ans)),ans.end());for(const auto &c:ans) std::cout << c;std::cout << '\n';
}int main(){std::cin.tie(nullptr)->sync_with_stdio(false);int tt = 1;std::cin >> tt;for(int ti = 0;ti<tt;++ti){solve();}return 0;
}

3.4 问题 D: 一锐的字符串游戏

思路

根据题意,只看当前是否有连续两个相同的字符,因此考虑使用栈,如果当前没有两个相邻的两个字符,那么就一锐就输了,否则就是一锐赢了

我的代码

注意使用std::stack的时候要先判断栈非空才能取出top()元素,或者放入一个哨兵也可以解决这个问题

#include<bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using pii = std::pair<int,int>;
constexpr int N = 1e5+5,M = 1e6+5,INF = 0x3f3f3f3f;
#define pb emplace_back
#define all(v) v.begin(),v.end()void solve(){std::string s;std::cin >> s;std::stack<char> stack;bool flag = false;for(const auto& c:s){if(!stack.empty()&&stack.top()==c){flag = !flag;stack.pop();}else{stack.emplace(c);}}std::cout << (flag?"Yes":"No") << '\n';
}int main(){std::cin.tie(nullptr)->sync_with_stdio(false);int tt = 1;// std::cin >> tt;for(int ti = 0;ti<tt;++ti){solve();}return 0;
}

3.5 问题 E: 奇怪的整数序列

思路

由于数据范围限制,不能暴力求解,我们只考虑O(n*logn)的时间复杂度,因此求解f()函数的时候,需要将时间复杂度降至O(logn)的级别,我们发现2的i(i>=0)次方的值都是1,又发现任何偶数的f()值与它除以2的值是相同的,而奇数只能通过减一才能变成偶数(至于为什么只能减一,不能加一,因为我们是反着求f函数的,因此跟正着求的相反的操作)。然后通过cnt数组计数一个f()值出现的次数,计算累加cnt,即加上(1+cnti-1)*(cnti-1)/2。具体实现见代码

我的代码

#include<bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using pii = std::pair<int,int>;
constexpr int N = 1e5+5,M = 1e6+5,INF = 0x3f3f3f3f;
#define pb emplace_back
#define all(v) v.begin(),v.end()/*
f(0) = 0;
f(2·x) = f(x);
f(2·x + 1) = f(x)+1f(0) = 0;f(1) = 1;f(2) = 1;
f(3) = 2;f(4) = 1;f(5) = 2;
f(6) = 2;
f(7) = 3;f(8) = 1;f(9) = 2;
f(10) = 2;
f(11) = 3;
f(12) = 2;
*/int n;
std::vector<int> a(N,0);
std::vector<int> cal(N,0);
std::vector<int> cnt(N,0);
std::vector<int> fac;void pre(){int t = 1;while(t<=int(1e9)){fac.pb(t);t*=2;}
}int f(int x){int cnt = 0;while(*std::lower_bound(all(fac),x)!=x){//O(logn*logn)if(x&1){x-=1;++cnt;}else{x/=2;}}return ++cnt;
}void solve(){std::cin >> n;for(int i = 1;i<=n;++i) std::cin >> a[i];for(int i = 1;i<=n;++i){cal[i] = f(a[i]);++cnt[cal[i]];}i64 ans = 0;for(int i = 1;i<N;++i){if(cnt[i]>1){ans+=1LL*cnt[i]*(cnt[i]-1)/2;}}std::cout << ans << '\n';
}int main(){std::cin.tie(nullptr)->sync_with_stdio(false);pre();int tt = 1;// std::cin >> tt;for(int ti = 0;ti<tt;++ti){solve();}return 0;
}

3.6 问题 F: 兔兔的和谐图

思路

考察并查集,难在后续的check和merge,以及如何控制时间复杂度,暴力使用并查集判断是否成为和谐图会超时,这块也不知道怎么说思路,大家直接看代码吧

我的代码

#include<bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using pii = std::pair<int,int>;
constexpr int N = 2e5+5,M = 1e6+5,INF = 0x3f3f3f3f;
#define pb emplace_back
#define all(v) v.begin(),v.end()int n,m;struct DSU {int _n;std::vector<int> _fa,_size,_max,_min;DSU(){}DSU(int n){init(n);}void init(int n) {_fa.resize(n);_max.resize(n);_min.resize(n);std::iota(_fa.begin(),_fa.end(),0);std::iota(_max.begin(),_max.end(),0);std::iota(_min.begin(),_min.end(),0);_size.assign(n,1);}int find(int x) {if(x!=_fa[x]) {_fa[x] = find(_fa[x]);}return _fa[x];}bool same(int x,int y) {return find(x)==find(y);}bool merge(int x,int y) {int fx = find(x);int fy = find(y);if(fx!=fy) {_size[fx] += _size[fy];_fa[fy] = fx;_min[fx] = std::min(_min[fx],_min[fy]);_max[fx] = std::max(_max[fx],_max[fy]);return true;}return false;}
};std::vector<bool> vis(N,false);void solve(){std::cin >> n >> m;DSU dsu(n+5);for(int i = 0;i<m;++i){int u,v;std::cin >> u >> v;// edges[u].pb(v);// edges[v].pb(u);dsu.merge(u,v);}int cur_fa = 0,cur_min = 0,cur_max = 0;int ans = 0;for(int i = 1;i<=n;++i){if(vis[i]) continue;cur_fa = dsu.find(i);cur_min = dsu._min[cur_fa];cur_max = dsu._max[cur_fa];for(int j = cur_min;j<=cur_max;++j){if(!vis[j]){int j_fa = dsu.find(j);if(cur_fa!=j_fa){dsu.merge(cur_fa,j_fa);++ans;cur_max = dsu._max[cur_fa];}vis[j] = true;}}}std::cout << ans << '\n';
}int main(){std::cin.tie(nullptr)->sync_with_stdio(false);int tt = 1;// std::cin >> tt;for(int ti = 0;ti<tt;++ti){solve();}return 0;
}

3.7 问题 G: 分红包

思路

先把题目放上来,思路和代码等周三题解出来好了,我的代码逻辑肯定有问题,但是学校OJ的后台测试点太少了,让我混过去AC了

3.8 问题 H: 动若脱兔

思路

同上,大家可以先看一下题,等周三我再把思路和题解放上来

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

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

相关文章

前端 el-table-column 里加上el-form-item 上面有黑色悬浮

如图所示 解决方法&#xff0c;查看你的 el-table-column 是否设置了 show-overflow-tooltip 属性&#xff0c;如果是去掉即可

debian编译失败

A、缘由和分析 debian的代码在删除该路径下的2个包后&#xff0c; 重新全编&#xff0c;编译不过的问题。 至于我为什么删除这2个包&#xff0c;这是因为在sdk第一次编译时一些文件已经打包进去了&#xff0c;我现在的修改无法更新进img中&#xff0c;而现在我的项目中不需要…

大数据新视界 -- 大数据大厂之 Hive 数据压缩:优化存储与传输的关键(上)(19/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【k8s】监控metrics-server

metrics-server介绍 Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。Metric server从每个节点上KubeletAPI收集指标&#xff0c;通过Kubernetes聚合器注册在Master APIServer中。为集群提供Node、Pods资源利用率指标。 就像Linux 系统一样…

EasyAnimateV5 视频生成大模型原理详解与模型使用

在数字内容创作中&#xff0c;视频扮演的角色日益重要。然而&#xff0c;创作高质量视频通常耗时且昂贵。EasyAnimate 系列旨在利用人工智能技术简化这一过程。EasyAnimateV5 建立在其前代版本的基础之上&#xff0c;不仅在质量上有所提升&#xff0c;还在多模态数据处理和跨语…

泷羽sec学习打卡-shell命令7

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell6 for循环while循环实践是检验真理的唯一标准 见天我们继续学习下shell中的基…

8. 一分钟读懂“代理模式”

8.1 模式介绍 代理模式是一种结构型设计模式&#xff0c;它通过提供一个代理对象来替代对另一个对象&#xff08;真实对象&#xff09;的访问。代理对象与真实对象实现相同的接口&#xff0c;并通过代理类对真实对象的访问进行控制&#xff0c;可以在调用前后执行附加操作&…

基于SpringBoot+Vue的宠物咖啡馆系统-无偿分享 (附源码+LW+调试)

目录 1. 项目技术 2. 功能菜单 3. 部分功能截图 4. 研究背景 5. 研究目的 6. 可行性分析 6.1 技术可行性 6.2 经济可行性 6.3 操作可行性 7. 系统设计 7.1 概述 7.2 系统流程和逻辑 7.3 系统结构 8. 数据库设计 8.1 数据库ER图 &#xff08;1&#xff09;宠物订…

Python毕业设计选题:基于大数据的淘宝电子产品数据分析的设计与实现-django+spark+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 电子产品管理 系统管理 数据可视化分析看板展示 摘要 本…

【人工智能的深度分析与最新发展趋势】

人工智能的深度分析与最新发展趋势 引言 人工智能&#xff08;AI&#xff09;是现代科技的重要组成部分&#xff0c;它涉及模拟人类智能的算法和技术。随着计算能力的提升和数据量的激增&#xff0c;AI的应用正在迅速渗透到各个行业。本文将深入分析人工智能的概念、技术、应…

NLP自然语言处理——关键词提取之 TF-IDF 算法(五分钟带你深刻领悟TF-IDF算法的精髓)

&#x1f525;博客主页&#xff1a;是dream &#x1f680;系列专栏&#xff1a;深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 &#x1f498;每日语录&#xff1a;要有最朴素的生活和最遥远&#x1f30f;的梦想&#xff0c;即使明天天寒地冻&am…

【连接池】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

预训练模型与ChatGPT:自然语言处理的革新与前景

目录 一、ChatGPT整体背景认知 &#xff08;一&#xff09;ChatGPT引起关注的原因 &#xff08;二&#xff09;与其他公司的竞争情况 二、NLP学习范式的发展 &#xff08;一&#xff09;规则和机器学习时期 &#xff08;二&#xff09;基于神经网络的监督学习时期 &…

LeetCode - #151 颠倒字符串中的单词

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

微服务即时通讯系统(5)用户管理子服务,网关子服务

用户管理子服务&#xff08;user文件&#xff09; 用户管理子服务也是这个项目中的一个业务最多的子服务&#xff0c;接口多&#xff0c;但是主要涉及的数据表只有user表&#xff0c;Redis的键值对和ES的一个搜索引擎&#xff0c;主要功能是对用户的个人信息进行修改管理&#…

vue结合canvas动态生成水印效果

在 Vue 项目中添加水印可以通过以下几种方式实现&#xff1a; 方法一&#xff1a;使用 CSS 直接通过 CSS 的 background 属性实现水印&#xff1a; 实现步骤 在需要添加水印的容器中设置背景。使用 rgba 设置透明度&#xff0c;并通过 background-repeat 和 background-size…

html-两个div,让一个div跟随另外一个div的高度

在开发的过程中遇到有些场景事这样的&#xff0c;两个div的高度不一致&#xff0c;而且都是动态高度&#xff0c;有的时候div1高&#xff0c;有的时候div2高&#xff0c;如果设置flex的话&#xff0c;那么就会把较矮的元素撑大&#xff0c;但是我想始终都以div1的高度作为基准&…

知识管理系统|基于springBoot的知识管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势…

Kruskal 算法在特定边权重条件下的性能分析及其实现

引言 Kruskal 算法是一种用于求解最小生成树(Minimum Spanning Tree, MST)的经典算法。它通过逐步添加权重最小的边来构建最小生成树,同时确保不会形成环路。在本文中,我们将探讨在特定边权重条件下 Kruskal 算法的性能,并分别给出伪代码和 C 语言实现。特别是,我们将分…

12.2深度学习_视觉处理CNN_池化层、卷积知识

3.池化层 3.1 概述 池化层 (Pooling) 降低维度, 缩减模型大小&#xff0c;提高计算速度. 即: 主要对卷积层学习到的特征图进行下采样&#xff08;SubSampling&#xff09;处理。 池化层主要有两种: 最大池化 max pooling 最大池化是从每个局部区域中选择最大值作为池化后的值…