当前位置: 首页 > article >正文

美团2024年春招第一场笔试 C++

目录

1,小美的平衡矩阵

2,小美的数组询问

3,小美的MT

 4,小美的朋友关系


1,小美的平衡矩阵

 【题目描述】

给定一个n*n的矩阵,该矩阵只包含数字0和1。对于 每个i(1<=i<=n),求在该矩阵中,有多少个i*i的区域满足0的个数等于1的个数???

【题目解析】

示例演示:

 如上图,1*1的区域结果为0,2*2的区域结果为7。

算法:前缀和+遍历

题目中给的数据范围是n<=200,所以可以直接遍历数组。

维护 一个前缀和数组统计以(x,y)这个点为右下角,以(1,1)这个点为左上角,这个区域中所有元素的和,由于数组中的数要么是0,要么是1,所以前缀和就表示某个区域中1的个数。

有了前缀和数组,就可以快速 求出某个区域中1的个数,如图:

而这个区域的大小我们是知道的,假设是k,那么这个区域的元素个数就是k*k。如果满足这个区间中1的个数等于k*k/2,那么说明 这个区间中0和1的个数 相等。而1的个数我们可以通过前缀和来表示。

同时还有一点,如果k为奇数,那么k*k的区域中元素个数一定为奇数 ,所以0和1的个数一定不相等。直接输出0即可。

 注意:在输入数据的时候,如果是以整数的形式接受,那么不建议使用cin,因为cin会把第一行的所有数据读成一个整数。就比如 上面的示例,第一行会被读成一个整数1010,而我们期望是读到4个整数的,这是可以使用scanf("%1d",&a),使用 %1d占位符可以确保读到的第一行是4个整数。

【代码】

#include <iostream>
#include <vector>
using namespace std;const int N = 205;
int arr[N][N], s[N][N];
//s为前缀和数组
//统计矩形(1,1)到(n,n)中1的数量int main()
{int n = 0;cin >> n;for(int  i=1;i<=n;i++)for (int j = 1; j <= n; j++){scanf("%1d", &arr[i][j]);s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + arr[i][j];}cout << 0 << endl;for (int k = 2; k <= n; k++){if (k & 1){cout << 0 << endl;continue;}int ans = 0;for(int i=1;i+k-1<=n;i++)for (int j = 1; j+k-1 <= n; j++){//(i,j)是左上角,需要我们计算出k*k这个区域右下角的坐标int x = i + k - 1;int y = j + k - 1;if (s[x][y] - s[i - 1][y] - s[x][j - 1] + s[i - 1][j - 1] == k * k / 2)ans++;}cout << ans << endl;}return 0;
}

2,小美的数组询问

 直接遍历即可 

#include <iostream>
using namespace std;const int N=1e5+10;
int arr[N];
int main()
{int n=0,q=0;cin>>n>>q;long long sum=0,count=0;for(int i=1;i<=n;i++){cin>>arr[i];sum+=arr[i];if(arr[i]==0)count++;}int l,r;while(q--){cin>>l>>r;cout<<sum+count*l<<" "<<sum+count*r<<endl;}return 0;
}

3,小美的MT

统计元字符中 有多少个M和T,再加上最多可以修改 多少个即可。

//小美的MT
#include <iostream>
#include <string>
using namespace std;int main()
{int n = 0, k = 0;cin >> n >> k;string str;cin >> str;int ans = 0;for (int i = 0; i < n; i++){if (str[i] == 'M' || str[i] == 'T')ans++;}if (k > n - ans)cout << n << endl;elsecout << ans + k << endl;return 0;
}

 4,小美的朋友关系

 【题目描述】

总人数为n,编号u和v的人之间存在朋友关系,在这n个人中,存在m个朋友关系。

对于这些关系,进行q次事件,格式为【op,u,v】,其中u和v表示人的编号。op表示要进行哪种操作,当op==1时,u和v的朋友关系淡忘,也就是断开u和v的朋友关系。当op==2时,表示查询u和v是否可以建立朋友关系,可以通过第三方或者本来就是朋友关系。

针对每次的op==2操作,返回一个结果Yes or No,表示是否可以建立朋友关系 。

【思路】

这n个人中存在许多的朋友关系,比如编号1-5是朋友,编号6-10是朋友,这两个关系是独立的集合,所以可以想到的是使用并查集来记录朋友关系。

并查集传送门:

【算法与数据结构】并查集详解+题目_并查集结构体-CSDN博客

 并查集中的每个集合可以看成是一棵树,独立多个集合,就是多个独立的树。每个树的根节点也就是每个集合的父节点。


刚开始我的思路是将这m个朋友关系,使用并查集来存储。

但是在q次操作中,op=2是查询是否可以 建立朋友关系的操作,这个简单,只需判断这两个人是否在同一个集合中,也就是这两个人的父节点是否相同。但是对于op=1删除朋友关系操作,比较困难,因为并查集擅于进行 添加关系操作的,不好处理删除节点关系所以在删除朋友关系这里出现了问题。

我们可以试着把删除朋友关系变成添加朋友关系。这样并查集就可以做了。那么怎么实现呢?

我们可以先将这m个朋友关系用特定的容器存储下来,首先遍历q次操作,遇到删除操作(u,v),在容器中删除(u,v)。

注意:这里删除的时候,要删除的朋友关系是(u,v),有可能存储的时候,朋友关系是(u,v),也有可能是(v,u),这些都是要删除的。

遇到op=2时,不进行操作。一次操作完成后,将该次操作用数组记录下来【op,u,v】。


顺序遍历完后,此时将容器中剩余的朋友关系,构建并查集。 然后逆序遍历记录操作的数组,遇到op=1时,就添加朋友关系,遇到op=2时,就查询朋友关系,判断父节点是否相等即可。

 【代码】

//小美的朋友关系
#include <iostream>
#include <vector>
#include <set>
using namespace std;
const int N = 1e5;//总人数,初始的朋友关系数,事件数量
int n, m, q;
vector<int> parent;//并查集
set<pair<int, int>> st;//存储初始的朋友关系
//存储事件
struct node
{int op, u, v;
}arr[N+5];
//找父节点,路径压缩
int find(int x)
{if (parent[x] != x)parent[x] = find(parent[x]);return parent[x];
}
//合并
void unite(int x, int y)
{int rootX = find(x);int rootY = find(y);if (rootX == rootY)return;parent[rootX] = rootY;
}
int main()
{cin >> n >> m >> q;//初始化并查集parent.resize(n + 1);for (int i = 1; i <= n; i++)parent[i] = i;//存储关系int op,u, v;while (m--){cin >> u >> v;st.insert({ u,v });}int num = 0;while (q--){cin >> op >> u >> v;//处理删除操作if (op == 1){if (st.find({ u,v }) != st.end())st.erase({ u,v });else if (st.find({ v,u }) != st.end())st.erase({ v,u });elsecontinue;//说明u和v表示朋友关系,此次删除操作无意义,不需要存储下来}//记录操作arr[num++] = { op,u,v };}//删除关系完成后,剩余的元素是没有进行操作的//构建并查集for (auto [u, v] : st)unite(u, v);vector<bool> ans;//记录最终结果//逆序遍历操作//如果是删除就进行合并//如果是查询就进行判断是否在同一个集合for (int i = num - 1; i >= 0; i--){op = arr[i].op, u = arr[i].u, v = arr[i].v;if (op == 1){//合并unite(u, v);}else{//判断ans.emplace_back(find(u) == find(v));}}for (int i = ans.size() - 1; i >= 0; i--)if (ans[i])cout << "Yes" << endl;elsecout << "No" << endl;return 0;
}

上述代码是使用vector来实现并查集的,题目中的数据范围n是1e9,如果使用vector,就需要开辟1e9个空间,会超出内存限制。所以这里实现并查集的时候,需要使用map来替代。存储当前节点和它的父节点。具体原因,看下方:

初始时,每个节点的父节点就是自己本身。比如mp[1]=1。


当我们逆序遍历时,当遇到op=2,查询朋友关系时,给的两个朋友编号u和v,之前可能没初始化。比如n=10,给了3个朋友关系(1,3),(3,2),(4,6),当我们查询的时候,可能查询的是(5,7),这两个节点没有初始化,也就是mp[5]=0,mp[7]=0,可以发现这两个节点的父节点都是0,如果直接判断,得到的结果是可以构成朋友关系,但本质是不能构成朋友关系的。


也可以看下方代码的初始化部分,我们只初始化了存在朋友关系的节点,其他的节点没有初始化,他们的父节点默认就是0。如果我们开始将所有节点都初始化好,那么就会超出内存限制,那么就和使用vector一样了,甚至占用的内存比vector还要大,所以我们不能一次性就初始还所有节点。而是当遇到一个没初始化的节点,就初始化即可。


所以在查询操作的时候,如果mp[u]=0,或者mp[v]=0,就把这两个值做一下初始化mp[u]=u或者mp[v]=v,这样在判断的时候就不会出错了。


而如果使用的是vector来表示并查集,是不需要考虑这个问题的,因为vector会开辟n个空间,将所有人都初始化好,父节点就是自己。而使用map来存储,只会存储存在朋友关系的节点,如果出现一个新的节点,需要我们自己再初始化。这也就是map不会超出内存限制而vector会超出内存限制的原因

 【代码】

//小美的朋友关系
#include <iostream>
#include <vector>
#include <map>
#include <set>
using namespace std;
const int N = 1e5;//总人数,初始的朋友关系数,事件数量
int n, m, q;
map<int,int> parent;//并查集
set<pair<int, int>> st;//存储初始的朋友关系//存储事件
struct node
{int op, u, v;
}arr[N + 5];
//找父节点,路径压缩
int find(int x)
{if (parent[x] != x)parent[x] = find(parent[x]);return parent[x];
}
//合并
void unite(int x, int y)
{int rootX = find(x);int rootY = find(y);if (rootX == rootY)return;parent[rootX] = rootY;
}
int main()
{cin >> n >> m >> q;//初始化并查集和关系集合int op, u, v;for (int i = 0; i < m; i++){cin >> u >> v;parent[u] = u;parent[v] = v;st.insert({ u,v });}int num = 0;while (q--){cin >> op >> u >> v;//处理删除操作if (op == 1){if (st.find({ u,v }) != st.end())st.erase({ u,v });else if (st.find({ v,u }) != st.end())st.erase({ v,u });elsecontinue;//说明u和v表示朋友关系,此次删除操作无意义,不需要存储下来}//记录操作arr[num++] = { op,u,v };}//删除关系完成后,剩余的元素是没有进行操作的//构建并查集for (auto [u, v] : st)unite(u, v);vector<bool> ans;//记录最终结果//逆序遍历操作//如果是删除就进行合并//如果是查询就进行判断是否在同一个集合for (int i = num - 1; i >= 0; i--){op = arr[i].op, u = arr[i].u, v = arr[i].v;if (op == 1){//合并unite(u, v);}else{//parent[u]==0,说明该节点第一次出现,初始化为uif (parent[u] == 0)parent[u] = u;if (parent[v] == 0)parent[v] = v;//判断ans.emplace_back(find(u) == find(v));}}for (int i = ans.size() - 1; i >= 0; i--)if (ans[i])cout << "Yes" << endl;elsecout << "No" << endl;return 0;
}

相关文章:

美团2024年春招第一场笔试 C++

目录 1&#xff0c;小美的平衡矩阵 2&#xff0c;小美的数组询问 3&#xff0c;小美的MT 4&#xff0c;小美的朋友关系 1&#xff0c;小美的平衡矩阵 【题目描述】 给定一个n*n的矩阵&#xff0c;该矩阵只包含数字0和1。对于 每个i(1<i<n)&#xff0c;求在该矩阵中&am…...

XHTMLConverter把docx转换html报java.lang.NullPointerException异常

一.报错 1.报错信息 org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerExceptionat org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77)at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConve…...

OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 NV12 (YUV420p) 色彩空间转换为 RGB。该函数将输入图像从 NV12 色彩空间转换到 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图…...

pojovoDto等概念

Java 中的数据模型概念 POJO (Plain Old Java Object) POJO 是最简单的 Java 对象&#xff0c;不依赖于特定的框架&#xff0c;不实现任何特殊的接口&#xff0c;也不继承特定的类。 特点 具有无参构造函数属性使用 private 修饰提供公共的 getter 和 setter 方法可序列化 …...

COdeTop-206-反转链表

题目 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 …...

线段树讲解(小进阶)

目录 前言 一、线段树知识回顾 线段树区间加减 区间修改维护&#xff1a; 区间修改的操作&#xff1a; 区间修改update&#xff1a; 线段树的区间查询 区间查询&#xff1a; 区间查询的操作&#xff1a; 递归查询过程&#xff1a; 区间查询query&#xff1a; 代码&…...

4082P 信号/频谱分析仪

——新利通仪器仪表—— 4082P丨信号/频谱分析仪 2Hz&#xff5e;110GHz Ceyear 4082系列信号/频谱分析仪在显示平均噪声电平、相位噪声、互调抑制、动态范围、幅度精度和测试速度等方面具备极佳的射频性能。具备强大的频谱分析、符合标准的功率测量套件、I/Q分析、瞬态分析…...

夏季跑步注意

夏季跑步注意 医学专家警示&#xff1a;大众跑者需以安全为先&#xff0c;警惕高温环境下“盲目冲刺”的风险。一些事件再次印证马拉松适宜气温为6-15℃&#xff0c;超过20℃时需主动降速并增加补水量。 所以建议每一位跑友&#xff0c;为了健康的跑步&#xff0c;每年除了做…...

openharmony5.0.0中C++公共基础类测试-线程相关(一)

C公共基础类测试及源码剖析 延续传统&#xff0c;show me the code&#xff0c;除了给出应用示例还重点分析了下openharmony中的实现。 简介 openharmony中提供了C公共基础类库&#xff0c;为标准系统提供了一些常用的C开发工具类&#xff0c;本文分析其实现&#xff0c;并给…...

TDengine 数据订阅设计

简介 数据订阅作为 TDengine 的一个核心功能&#xff0c;为用户提供了灵活获取所需数据的能力。通过深入了解其内部原理&#xff0c;用户可以更加有效地利用这一功能&#xff0c;满足各种实时数据处理和监控需求。 基本概念 主题 与 Kafka 一样&#xff0c;使用 TDengine 数…...

python:mido 提取 midi文件中某一音轨的音乐数据

pip install mido 使用 mido库可以方便地处理 MIDI 文件&#xff0c;提取其中音轨的音乐数据。 1.下面的程序会读取指定的 MIDI 文件&#xff0c;并提取指定编号音轨的音乐数据&#xff0c;主要包括音符事件等信息。 编写 mido_extract.py 如下 # -*- coding: utf-8 -*- &…...

vue3 中推荐使用的页面布局方式

1、Flexbox布局 原理 Flexbox&#xff08;弹性盒子布局模型&#xff09;提供了一种更加高效的方式来对容器中的子元素进行布局、对齐和分配空间。它能够根据容器的大小和子元素的内容自动调整布局&#xff0c;非常适合一维布局&#xff08;水平或垂直方向&#xff09;。 优…...

URP-UGUI交互功能实现

一、非代码层面实现交互&#xff08;SetActive&#xff09; Button &#xff1a;在OnClick&#xff08;&#xff09;中添加SetActive方法&#xff08;但是此时只首次有效&#xff09; Toggle &#xff1a;在OnClick&#xff08;&#xff09;中添加动态的SetActive方法 &#…...

UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025

UniGoal的提出了一个通用的零样本目标导航框架&#xff0c;能够统一处理多种类型的导航任务 &#xff08;如对象类别导航、实例图像目标导航和文本目标导航&#xff09;&#xff0c;而无需针对特定任务进行训练或微调。 它的特点是 图匹配与多阶段探索策略&#xff01;&#x…...

通过Quartus II实现Nios II编程

目录 一、认识Nios II二、使用Quartus II 18.0Lite搭建Nios II硬件部分三、软件部分四、运行项目 一、认识Nios II Nios II软核处理器简介 Nios II是Altera公司推出的一款32位RISC嵌入式处理器&#xff0c;专门设计用于在FPGA上运行。作为软核处理器&#xff0c;Nios II可以通…...

Linux/AndroidOS中进程间的通信线程间的同步 - IPC方式简介

前言 从来没有总结过Linux/Android系统中进程间的通信方式和线程间的同步方式&#xff0c;这个专栏就系统总结讨论一下。首先从标题可知&#xff0c;讨论问题的主体是进程和线程、通信和同步&#xff1b;在这里默认你理解进程和线程的区别。通信和同步有什么概念上的区别&…...

Windows:注册表配置应用

0、简介 本篇博客记录一下&#xff0c;日常的系统注册表配置选项&#xff0c;以防再次遇到问题不知如何解决。 1、开机启动配置 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run :: 此位置存储了所有用户登录时需要启动的程序。 在该项下新建字符串值&#…...

升级xcode16之后react-native-zip-archive不兼容,unsupported option ‘-G‘

问题 升级xcode到16之后,xcode build报错:unsupported option -G for target x86_64-apple-ios13.4-simulator (in target RNZipArchive from project Pods) 出现原因 在 React Native 项目中,当你将 Xcode 升级到 16 后,可能会遇到 RNZipArchive 相关的编译错误,特别是…...

WebXR教学 05 项目3 太空飞船小游戏

准备工作 自动创建 package.json 文件 npm init -y 安装Three.js 3D 图形库&#xff0c;安装现代前端构建工具Vite&#xff08;用于开发/打包&#xff09; npm install three vite 启动 Vite 开发服务器&#xff08;推荐&#xff09;&#xff08;正式项目开发&#xff09; …...

网页在浏览器中显示的原理(简要)

网页在浏览器中显示的过程是一个复杂的多阶段流程。 1. 输入URL并发起请求 用户在地址栏输入URL并回车 浏览器检查缓存&#xff08;DNS缓存、页面缓存等&#xff09; 如果没有缓存&#xff0c;通过DNS解析获取服务器IP地址 建立TCP连接&#xff08;三次握手&#xff09; 发…...

rl中,GRPO损失函数详解。

文章目录 **一、GRPO损失函数的设计背景****二、代码逐行解析****三、关键组件详解****1. 对数概率与KL散度计算****2. 优势值与策略梯度****3. 掩码与平均损失****四、训练动态与调参建议**在TRL(Transformer Reinforcement Learning)库中,GRPO(Group Relative Policy Opt…...

【Java面试笔记:基础】12.Java有几种文件拷贝方式?哪一种最高效?

在 Java 中,文件拷贝可以通过多种方式实现,不同方式的性能和适用场景有所差异。 1. Java 文件拷贝方式 传统 IO 方式 使用 FileInputStream 和 FileOutputStream,通过循环读取和写入数据实现文件拷贝。 示例代码: try (InputStream is = new FileInputStream("sou…...

【leetcode】3524 求出数组的X值1

题目链接 题目描述 给你一个正整数数组 nums 和一个正整数 k。 你可以对数组执行一次操作&#xff1a;移除不重叠的前缀和后缀&#xff08;可以为空&#xff09;&#xff0c;留下一个连续非空子数组。 对于每一种留下的子数组&#xff0c;计算&#xff1a; (该子数组的乘积…...

达梦统计信息收集情况检查

查询达梦某个对象上是否有统计信息 select id,T_TOTAL,N_SMAPLE,N_DISTINCT,N_NULL,BLEVEL,N_LEAF_PAGES,N_LEAF_USED_PAGES,LAST_GATHERED from sysstats where id IN (select id from sysobjects where upper(name)upper(&objname));可能有系统对象&#xff0c;可以增加…...

1️⃣5️⃣three.js_GUI辅助调试器

15、GUI辅助调试器 3D虚拟工厂在线体验 GUI辅助调试器将原本需要修改代码调整参数并刷新页面的操作,简化为直接在GUI中实时调整,实现所见即所得的效果。 导入GUI 库 //引入GUI辅助调试器 import {GUI } from three/addons/libs/lil-gui.module.min.js创建GUI辅助调试器对象 c…...

【matlab】气泡图的应用

【matlab】气泡图的应用 .rtcContent { padding: 30px; } .lineNode {font-size: 12pt; font-family: "Times New Roman", Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; } clear load zb_equi.mat load …...

@Configuration注解对应实现implements WebMvcConfigurer的配置不生效问题。

检查项目是否有其他配置实现了 extends WebMvcConfigurationSupport&#xff0c;如果有就是这个配置导致实现implements WebMvcConfigurer的配置不生效。 我的问题项目有imgconfig&#xff0c;和webconfig Configuration public class ImgConfig extends WebMvcConfigurationS…...

飞帆控件:在编辑模式下额外加载的库

飞帆是一个自由的控件设计平台。在飞帆中&#xff0c;我们可以很方便地创建基于 Vue 2 组件的控件&#xff0c;并使用控件来搭建网页。 他山之石&#xff0c;可以攻玉。在创建控件中&#xff0c;使用 js 、css 依赖库能让我们的控件更强大。 有些时候&#xff0c;在编辑模式下…...

【k8s】docker、k8s、虚拟机的区别以及使用场景

一、Docker &#xff08;一&#xff09;概念 Docker 是一个开源的应用容器引擎&#xff0c;允许开发者将应用及其依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可实现虚拟化。 &#xff08;二&#xff09;隔离性 Docker 的隔离…...

Super-Vlan和MUX-Vlan的原理、配置、区别

Super-Vlan 原理 Super-Vlan也叫Aggregate-Vlan。 一般的三层交换机中&#xff0c;通常是采用一个VLAN对应一个vlanif接口的方式实现广播域之间的互通&#xff0c;这在某些情况下导致了IP地址的浪费。因为一个VLAN对应的子网中&#xff0c;子网号、子网定向广播地址、子网缺…...