【25届秋招】饿了么0817算法岗笔试

目录

  • 1. 第一题
  • 2. 第二题
  • 3. 第三题

⏰ 时间:2024/08/17
🔄 输入输出:ACM格式
⏳ 时长:100min

本试卷还有单选和多选部分,但这部分比较简单就不再展示。

最近终于有时间继续整理之前的笔试题了,因为时间仓促,难免有错误的地方,如有遇到欢迎在评论区指出。

饿了么这次笔试的时间还是比较仓促的,完成选择题后,留给三道编程题的时间就不多了。

1. 第一题

给定一个长度为 n n n 且仅由 0 0 0 1 1 1 两种字符构成的字符串 s s s。每次操作你都可以选择字符串 s s s 的任意一个字符,并将其反置。
询问经过恰好 k k k 次操作后,字符串 s s s 是否为一个回文字符串。
若当前字符为 0 0 0,反置后为 1 1 1。若当前字符为 1 1 1,反置后为 0 0 0
一个字符串被称作回文字符串,当且仅当这个字符串从左往右读和从右往左读都是相同的。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数 T ( 1 ≤ T ≤ 100 ) T\,(1\leq T\leq100) T(1T100) 代表数据组数,每组测试数据描述如下:
第一行输入两个整数 n , k ( 1 ≤ n ≤ 1000 , 0 ≤ k ≤ n ) n,k\,(1\leq n\leq1000,\,0\leq k\leq n) n,k(1n1000,0kn)
第二行输入一个长度为 n n n 且仅由 0 0 0 1 1 1 两种字符构成的字符串 s s s

输出描述

对于每一组测试数据,如果经过怡好 k k k 次操作后,字符串 s s s 可以成为一个回文字符串,在一行上输出 YES;否则,直接输出 NO

题解

首先我们需要统计将字符串 s s s 转化为回文串所需的最少操作次数,记为 c c c。具体来说,可以通过双指针遍历,计算出对应位置的字符不同的次数,这就是需要改变的字符对数。

然后我们考虑以下两种情况:

  1. k < c k<c k<c:显然无法在给定的操作次数内将字符串变为回文串,输出 “NO”。
  2. k ≥ c k\geq c kc:此时,我们需要考虑多余的操作次数 k − c k-c kc
    • 字符串长度为奇数:由于中间字符不影响回文性,因此我们可以通过多余的操作次数调整中间字符,从而总是能变成回文串,输出 “YES”。
    • 字符串长度为偶数:为了保证能够最终形成回文串,剩余操作次数 k − c k-c kc 必须为偶数(每次操作可以对称改变两边的字符),否则输出 “NO”。
#include <bits/stdc++.h>using namespace std;int ops(const string &s) {int left = 0, right = s.size() - 1;int changes = 0;while (left < right) {if (s[left] != s[right]) {changes++;}left++;right--;}return changes;
}void solve() {int n, k;cin >> n >> k;string s;cin >> s;int changes = ops(s);if (changes > k) {cout << "NO" << endl;} else if ((k - changes) % 2 == 0 || n % 2 == 1) {cout << "YES" << endl;} else {cout << "NO" << endl;}
}int main() {int t;cin >> t;while (t--) {solve();}return 0;
}

2. 第二题

有一个 n n n n n n 列的棋盘,每个格子上写着数字 0 0 0 1 1 1。有一个小球从某个格子出发,移动到写着 0 0 0 的格子时会向下移动一格,移动到写着 1 1 1 的格子时会向右移动一格,直到滚出棋盘边界。

现在有 9 9 9 个询问,每次询问在子矩阵 ( x 1 , y 1 ) ∼ ( x 2 , y 2 ) (x_1,y_1)\sim(x_2,y_2) (x1,y1)(x2,y2) 中,小球从 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 出发开始滚动,最后会从哪个格子滚出子矩阵 ( x 1 , y 1 ) ∼ ( x 2 , y 2 ) (x_1,y_1)\sim(x_2,y_2) (x1,y1)(x2,y2)

从某个格子滚出子矩阵 ( x 1 , y 1 ) ∼ ( x 2 , y 2 ) (x_1,y_1)\sim(x_2,y_2) (x1,y1)(x2,y2),意思是当前所在的格子在子矩阵内,但是小球滚动路径的下一个格子不在子矩阵内,视为滚出。

从棋盘 ( x , y ) (x,y) (x,y) 向右滚动一格即抵达 ( x , y + 1 ) (x,y+1) (x,y+1),从棋盘 ( x , y ) (x,y) (x,y) 向下滚动一格即抵达 ( x + 1 , y ) (x+1,y) (x+1,y)

输入描述

第一行输入一个整数 n ( 1 ≤ n ≤ 500 ) n\,(1\leq n\leq 500) n(1n500) 代表棋盘大小。
此后 n n n 行,每行输入 n n n 个整数 a 1 , a 2 , . . . , a n ( 0 ≤ a i ≤ 1 ) a_1,a_2,...,a_n\,(0\leq a_i\leq 1) a1,a2,...,an(0ai1) 代表棋盘上每个格子上写的数字。
n + 2 n+2 n+2 行输入一个整数 q ( 1 ≤ q ≤ 2 ⋅ 1 0 5 ) q\,(1\leq q\leq 2\cdot 10^5) q(1q2105) 代表询问次数。
随后 q q q 行,每行输入四个整数 x 1 , y 1 , x 2 , y 2 ( 1 ≤ x 1 , x 2 , y 1 , y 2 ≤ n , x 1 ≤ x 2 , y 1 ≤ y 2 ) x_1,y_1,x_2,y_2\,(1\leq x_1,x_2,y_1,y_2\leq n,x_1\leq x_2,y_1\leq y_2) x1,y1,x2,y2(1x1,x2,y1,y2n,x1x2,y1y2) 代表子矩阵范围。

输出描述

对于每一次询问,在一行上输出两个整数,代表小球滚出的位置。

题解

直接模拟的时间复杂度为 O ( q n ) O(qn) O(qn),看似会超时,但实际并不会。

#include <bits/stdc++.h>using namespace std;void query(const vector<vector<int>>& board) {int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;int cx = x1, cy = y1, last_cx = cx, last_cy = cy;while (cx >= x1 && cx <= x2 && cy >= y1 && cy <= y2) {last_cx = cx;last_cy = cy;if (board[cx][cy]) cy++;else cx++;}cout << last_cx << ' ' << last_cy << endl;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<vector<int>> board(n + 1, vector<int>(n + 1));for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cin >> board[i][j];}}int q;cin >> q;while (q--) {query(board);}return 0;
}

3. 第三题

给出一张由几个点 m m m 条带边权的边构成的无向连通图,你有恰好 k k k 次机会,选择一条边使得其边权 + 1 +1 +1。在 k k k 次操作全部完成后,你要选出一个合法的生成树,使得这棵生成树中:边权最小的边最大。

输出这个边权。

对于一张图,选择其中 n − 1 n-1 n1 条边,使得所有顶点联通,这些边一定会组成一棵树,即为这张图的一棵生成树。可以证明,图中存在至少一棵生成树。

输入描述

第一行输入三个整数 n , m , k ( 1 ≤ n , m ≤ 1 0 5 , 1 ≤ k ≤ 1 0 14 ) n,m,k\,(1\leq n,m\leq 10^5,1\leq k\leq 10^{14}) n,m,k(1n,m105,1k1014) 代表给定图的点数、边数和你的操作次数。
此后 m m m 行,第 i i i 行输入三个整数 a i , b i , c i ( 1 ≤ a i , b i ≤ n ; 1 ≤ c i ≤ 1 0 14 ) a_i,b_i,c_i(1\leq a_i,b_i\leq n;1\leq c_i\leq 10^{14}) ai,bi,ci(1ai,bin;1ci1014) 代表图上第 i i i 条边连接节点 a i a_i ai b i b_i bi,且边权为 c i c_i ci。保证图联通,没有重边。

输出描述

在一行上输出一个整数,代表全部生成树中、边权最小的边最大的那棵树,它的边权最小的边。

题解

先通过 Kruskal 算法求解最大生成树。为此,我们将图中的边按权值从大到小排序,然后依次选择不形成环的边加入生成树。得到最大生成树后,我们面临的问题是如何通过最多 k 次操作,将这些边中的最小边权尽量提高。考虑使用二分查找。二分查找的对象是最小边权的下界,假设当前下界为 mid,我们计算将所有生成树边的权值提升到至少 mid 所需的操作次数。如果这些操作次数不超过 k,说明 mid 是可行的,我们可以尝试更大的下界;否则,需要降低下界。最终,二分查找得到的值就是所有生成树中边权最小的最大值。

#include <bits/stdc++.h>using namespace std;using i64 = long long;struct UnionFind {vector<int> p;UnionFind(int n) : p(n) {iota(p.begin(), p.end(), 0);}int find(int x) {return p[x] == x ? x : (p[x] = find(p[x]));}bool unite(int x, int y) {int root_x = find(x);int root_y = find(y);if (root_x != root_y) {p[root_x] = root_y;return true;}return false;}
};int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;i64 k;cin >> n >> m >> k;vector<array<i64, 3>> edges(m);for (auto& [u, v, w] : edges) {cin >> u >> v >> w;--u;--v;}sort(edges.begin(), edges.end(), [](const auto& lhs, const auto& rhs) {return lhs[2] > rhs[2];});UnionFind uf(n);vector<i64> tree_edges;// 使用Kruskal算法构建最大生成树for (const auto& [u, v, w] : edges) {if (uf.unite(u, v)) {tree_edges.push_back(w);}}// 二分查找最小可能的边权i64 left = *min_element(tree_edges.begin(), tree_edges.end());i64 right = 1e14 + k;while (left < right) {i64 mid = left + (right - left + 1) / 2;i64 required = 0;// 计算需要多少次操作才能将所有边权提升到至少 midfor (i64 w : tree_edges) {required += max(0LL, mid - w);if (required > k) break; }if (required <= k) left = mid;else right = mid - 1;}cout << left << "\n";return 0;
}

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

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

相关文章

数学建模之数据分析【九】:数据清理概述

文章目录 一、什么是数据清理二、为什么数据清理很重要三、执行数据清洁的步骤四、如何执行数据清理五、数据清理的Python库实现5.1 数据检查与探索5.2 使用df.info()检查数据信息5.3 检查分类和数字列5.4 检查分类列中唯一值的总数5.5 执行数据清理的步骤5.5.1 删除所有上述不…

C++ 设计模式——观察者模式

观察者模式 观察者模式主要组成部分例一&#xff1a;工作流程第一步&#xff1a;定义观察者接口第二步&#xff1a;定义主题接口第三步&#xff1a;实现具体主题第四步&#xff1a;实现具体观察者第五步&#xff1a;主函数UML 图UML 图解析 例二&#xff1a;工作流程第一步&…

动态规划之买卖股票篇-代码随想录算法训练营第三十八天| 买卖股票的最佳时机ⅠⅡⅢⅣ,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

121. 买卖股票的最佳时机 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a; 动态规划之 LeetCode&#xff1a;121.买卖股票的最佳时机1 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定…

[数据集][目标检测]电力场景输电线异物检测数据集VOC+YOLO格式2060张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2060 标注数量(xml文件个数)&#xff1a;2060 标注数量(txt文件个数)&#xff1a;2060 标注…

K8s节点状态 NotReady排查

k8s节点由 Ready变成 NotReady izbp12ghzy6koox6fqt0suz NotReady slave 97d v1.23.3 izbp12ghzy6koox6fqt0svz Ready control-plane,master 98d v1.23.3节点进入 NotReady 状态可能是由于多种原因引起的&#xff0c;尤其是在资源过量分配&am…

环绕音效是什么意思,电脑环绕音效怎么开

Boom 3D是一款专业的音效增强软件&#xff0c;它拥有先进的音效处理技术和丰富的音效设置选项&#xff0c;可以为用户打造出高度定制化的音频体验&#xff0c;Boom 3D还拥有简洁直观的界面&#xff0c;操作简单易懂&#xff0c;即使是音频技术的新手也能轻松上手。本篇文章就将…

微信小程序引入全局环境变量

有时候一套代码要在多个小程序appId下使用,其中又有一些数据(文字)需要做区分.可以使用下面的方法 把要配置的数据以export default 形式导出 在app.js中,引入project.config.0.js文件,将导出的数据放在globalData中 在页面目录中,即可利用getApp()方法使用全局变量 也可以放数…

buuctf [HDCTF2019]Maze

前言&#xff1a;做题笔记。 常规 下载 解压 查壳 脱壳后用32IDA Pro打开。 得&#xff0c;迷宫类型的题目。(字符串有说。) 咳&#xff0c;此前思路对半分不行了。。。 合理猜测步数为&#xff1a;14。 那可以看看7 * 10的迷宫类型。(手动猜测的时候去取倍数如&#xff1a;0 2…

【三维深度补全模型】PENet

【版权声明】本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 参考书籍&#xff1a;《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python…

shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义详解

文章目录 一、概述1.1、普通字符1.2、元字符 二、转义字符$2.1、实例12.2、实例22.3、实例32.4、实例42.5、实例5 三、linux命令执行返回值$?说明 一、概述 shell中有两类字符&#xff1a;普通字符、元字符。 1.1、普通字符 在Shell中除了本身的字面意思外没有其他特殊意义…

校友林小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;树木管理管理&#xff0c;所属科管理&#xff0c;树木领取管理&#xff0c;树跟踪状态管理&#xff0c;用户信息统计管理&#xff0c;树木捐款管理&#xff0c;留言板管理 微信端…

基于vue框架的毕业设计管理系统5n36i(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,教师,课题信息,题目分类,选题信息,任务书,中期检查,提交论文,论文成绩,答辩成绩,校园公告,教研主任,申报课题 开题报告内容 基于Vue框架的毕业设计管理系统开题报告 一、引言 随着高等教育的不断发展&#xff0c;毕业设计作为培…

AITDK SEO扩展:为网站优化提供一站式解决方案

AITDK SEO扩展&#xff1a;为网站优化提供一站式解决方案 想提升你的网站在搜索引擎中的排名&#xff1f;让我们来看看AITDK SEO扩展&#xff0c;它是你网站优化的得力助手&#xff01;在这篇文章中&#xff0c;我将为你介绍AITDK SEO扩展的功能特点&#xff0c;以及它如何帮助…

警惕!低血糖来袭,这些“隐形信号”你中招了吗?

在这个快节奏的时代&#xff0c;我们往往忙于工作、学习与生活&#xff0c;却容易忽视身体发出的微妙警告。其中&#xff0c;低血糖作为一种常见但易被忽视的健康问题&#xff0c;正悄悄影响着许多人的生活质量。今天&#xff0c;就让我们一起揭开低血糖的神秘面纱&#xff0c;…

Java:包装类

文章目录 引入原因包装类代码演示包装类的其他常见操作 使用到的有关ArrayList的方法 引入原因 泛型和集合不支持基本数据类型&#xff0c;只能支持引用数据类型 包装类 包装类就是把基本类型的数据包装成对象 就是说不再是一个int类型的数&#xff0c;而是一个Integer类型的…

Stable Diffusion 使用详解(8)--- layer diffsuion

背景 layer diffusion 重点在 layer&#xff0c;顾名思义&#xff0c;就是分图层的概念&#xff0c;用过ps 的朋友再熟悉不过了。没使用过的&#xff0c;也没关系&#xff0c;其实很简单&#xff0c;本质就是各图层自身的编辑不会影响其他图层&#xff0c;这好比OS中运行了很多…

文件树控件开发

文件树控件和获取驱动信息功能 然后添加上查看文件信息的按钮 双击这个按钮添加上如下代码 void CRemoteClientDlg::OnBnClickedBtnFileinfo() {int ret SendCommandPacket(1);if (ret -1) {AfxMessageBox(_T("命令处理失败!!!"));return;}ClientSocket* pClient…

AI大模型独角兽 MiniMax 基于 Apache Doris 升级日志系统,PB 数据秒级查询响应

作者&#xff1a;MiniMax 基础架构研发工程师 Koyomi、香克斯、Tinker 导读&#xff1a;早期 MiniMax 基于 Grafana Loki 构建了日志系统&#xff0c;在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案&#xff0c;并基于 Apache …

Ubuntu 22安装和配置PyCharm详细教程(图文详解)

摘要&#xff1a;本文提供了在 Ubuntu 22 上通过官方 .tar.gz 文件安装 PyCharm 的详细教程。包括从 JetBrains 官方网站下载适合的 PyCharm 版本&#xff08;Community 或 Professional&#xff09;&#xff0c;在终端中解压并将其移动到 /opt 目录&#xff0c;配置适当的权限…

【C++题解】1147. 求1/1+1/2+2/3+3/5+5/8+8/13+13/21……的前n项的和

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1147. 求1/11/22/33/55/88/1313/21……的前n项的和 类型&#xff1a;函数 题目描述&#xff1a; 求1/11/22/33/55/88/1313/2121/34…的前 n 项的和。 输入&#xff1a; 输入一个…