【笔试】美团2023年秋招第1场笔试(后端数开软件方向)

文章目录

      • T1 小美玩排列
      • T2 小美走公路
      • T3 小美切蛋糕
      • T4 小美将字符串平铺成矩阵
      • T5 小美染色

23秋招,美团笔试1(技术)

美团2024届秋招笔试第一场编程真题

时间:2023.08,牛客补题

美团是少有的整份卷子5题都是算法题的,20*5=100分,其他家一般会有408选择题再配2个编程题。

所以美团的T4、T5有时候会稍微有点卡点,我也没法保证每次都ak,有时候会有只能拿个九十几的情况,不过好在笔试可以做两次(虽然好像AK也不给面)

T1 小美玩排列

有一个排列,一共有n个数,还有特殊的两个数x和y,请你帮助小美判断x和y在排列中是否相邻,是则输出”Yes”,不是则输出”No”

数据范围:

1 ≤ n ≤ 1e5

//AC
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200010;
int p[maxn];
int main() {int n;  cin>>n;for(int i = 1; i <= n; i++){int x;  cin>>x;p[x] = i;}int x, y;cin>>x>>y;if(abs(p[x]-p[y])==1){cout<<"Yes\n";}else{cout<<"No\n";}
}

T2 小美走公路

现有一条环形公路,总共有n个站点,a[i]代表第i个站点与第i+1个站点之间的距离,特殊的,a[n]表示第n个站点与第一个站点之间的距离。小美的出发地为x,目的地为y,请你求出x到y的最短距离

1 ≤ n ≤ 1e5

1 ≤ a[i] ≤ 1e9

//AC
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 200010;
LL a[maxn], s[maxn];
int main() {LL n;  cin>>n;LL sum = 0;for(LL i = 1; i <= n; i++){cin>>a[i];sum += a[i];}LL x,y ;  cin>>x>>y;if(x > y)swap(x,y);LL res = 0;for(LL i = x; i < y; i++){res += a[i];}res = min(res, sum-res);cout<<res<<"\n";
}

T3 小美切蛋糕

现有一个n*m的蛋糕矩阵a,a[i][j]代表一小块蛋糕的美味度,现在小美要和一个好朋友分享蛋糕,因此需要把这个蛋糕矩阵切成两半,并且要求分成两半后的两块蛋糕的美味度尽可能相等,即求出分成两半后的两块蛋糕的abs(s1 - s2)的最小值,s1代表第一块蛋糕的美味度,s2代表第二块蛋糕的美味度。要求:必须保证每一小块蛋糕的完整性(即不能斜着切,如果把整个大蛋糕正着放)

1 ≤ n , m≤ 1e3

1 ≤ a[i][j] ≤ 1e5

//AC
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[1010][1010];
// LL b[1010][1010], c[1010][1010];
LL b[1010], c[1010];
int main() {LL n, m;  cin>>n>>m;LL sum = 0;for(LL i = 1; i <= n; i++){for(LL j = 1; j <= m; j++){cin>>a[i][j];b[i] += a[i][j];c[j] += a[i][j];sum += a[i][j];// b[i][j] += a[i][j-1];// c[i][j] += a[i-1][j];}}LL res = 1e9+10, tmp = 0;for(LL i = 0; i <= n; i++){tmp += b[i];res = min(res, abs((sum-tmp)-tmp));}tmp = 0;for(LL j = 0; j <= m; j++){tmp += c[j];res = min(res, abs((sum-tmp)-tmp));}cout<<res<<"\n";
}

T4 小美将字符串平铺成矩阵

现有一个长度为n的且仅包含小写字母的字符串s,小美想把这个字符串s平铺成一个xy的矩阵,要求xy == n,平铺的方法为:将字符串前y个字符按顺序放到第一行,将字符串第y+1到第2*y个字符按顺序放到第二行,以此类推。现规定矩阵的权值为连通量的数目,连通量代表的是从一个点出发,上下左右若存在相同字符则可以继续扩展该连通量(类似于一个岛屿,上下左右若存在相同的字符则可以扩展这个岛屿,或者可以理解为上下左右如果是相同字符则可以合并成一个连通量),求矩阵的最小权值

1 ≤ n ≤ 1e4

//WA-最开始想直接set乱来,最后还是被迫换成dfs写
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int dx[] = {-1, 1, 0 ,0 };
int dy[] = {0, 0, -1, 1};
int main() {int n;  cin>>n;string s;  cin>>s;set<char>se;for(char ch : s){se.insert(ch);}// cout<<s[5]<<"\n";n = s.size();int res = 1e9+10;for(int i = 2; i < n; i++){if(n%i!=0)continue;int ts = 0;for(int j = 0; j < n; j++){set<char>tmp;int z = 0;int x = j/i, y = j%i;// tmp.insert(s[j]);int ok = 0;// z++;for(int k = 0; k < 4; k++){int nx = x+dx[k], ny = y+dy[k];if(nx<0||nx>=n/i || ny<0||ny>=i)continue;if(s[nx*i+ny]==s[j]){// cout<<j<<" "<<nx<<" "<<ny<<" "<<s[nx*i+ny]<<" "<<s[j]<<"\n";ok = 1;}// tmp.insert(s[nx*i+ny]);// z++;if(i==3 && j==2){// cout<<nx<<" "<<ny<<" "<<s[nx*i+ny]<<" "<<s[j]<<"\n";// cout<<x<<" "<<y<<" ";// cout<<nx<<' '<<ny<<" asd\n";}}// if(j>=0){tmp.insert(s[j-1]); z++; }// if(j<n){tmp.insert(s[j+1]); z++; }// if(j-i>=0){tmp.insert(s[j-i]); z++; }// if(j+i<n){tmp.insert(s[j+i]); z++; }// cout<<i<<","<<j<<","<<tmp.size()<<" "<<z<<"\n";// for(char ch : tmp)cout<<ch; cout<<"\n";// if(tmp.size()==z){//     ts++;//     // cout<<i<<", "<<j<<"\n";// }if(ok!=1){ts++;// cout<<i<<", "<<j<<"\n";}}if(ts<res){// cout<<i<<" "<<ts<<"\n";}res = min(res, ts);}// cout<<se.size()<<"\n";cout<<(int)(res+se.size())<<"\n";
}
//AC
//T4-AC
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int dx[] = {-1, 1, 0 ,0 };
int dy[] = {0, 0, -1, 1};
string s;
int n; 
int vis[10010];
// int ts = 0;
int ttt;
void dfs(int x, int y,int d){// cout<<x<<" "<<y<<"\n";for(int i = 0; i < 4; i++){int nx = x+dx[i], ny = y+dy[i];int nj = nx*d+ny;if(nx<0||nx>=n/d || ny<0||ny>=d || vis[nj])continue;if(s[nj] != s[ttt])continue;if(!vis[nj]){vis[nj] = 1;dfs(nx,ny,d);}}
}
int main() {cin>>n;cin>>s;int res = 1e9+10;for(int i = 1; i <= n; i++){if(n%i!=0)continue;int ts = 0;for(int j = 0; j < n; j++)vis[j] = 0;for(int j = 0; j < n; j++){int x = j/i, y = j%i;if(!vis[j]){// cout<<x<<' '<<y<<" asfd\n";ttt = j;dfs(x, y, i);ts++;}}// cout<<i<<" "<<ts<<"\n";res = min(res, ts);}// cout<<se.size()<<"\n";cout<<(int)(res)<<"\n";
}

T5 小美染色

现有一颗包含n个节点的树,节点i的权值为w[i],d[i]代表节点i相邻的节点集合。一开始所有节点均为白色,若两个相邻节点均为白色且权值的乘积为完全平方数则可以将两个节点都染成红色,问最多可以将多少个节点染成红色

1 ≤ n ≤ 1e5

1 ≤ w[i] ≤ 1e9

// 输出0有10%(数据3/30),暴力+剪枝可以再多骗一部分
// AC 
//1、给出n个点和n-1条边的一棵树
//2、每次操作,相邻且白色且权值的乘积是完全平方数的,改成红色。求最多可以染多少个红。
//3、每个点有两个状态,选和不选,那么就是0/1DP了,又给了个树,也就是树上01DP
// u是根节点 ,i是子节点。不选根时,子节点的最大方案数统计上来就行,dp[u][0] += max(dp[i][0],dp[i][1])
// 选根,需要符合条件(is_sqrt(a[u]*a[i])==1)的子节点同时不被选中,那么dp[u][1]=dp[u][0]-max(dp[i][0],dp[i][1])+dp[i][0]+2,即回退这个点的记录,并更新成同时选中这个子节点和根节点的状态。
// 最后答案就是 max(dp[0][0],dp[0][1])
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL maxn = 1e5 + 10;
LL a[maxn], c[maxn];
vector<LL>G[maxn];
LL dp[maxn][2];
LL res = 0;
int checksqrt(int x) { int d = sqrtl(x)+1e-7; return d*d == x; };
void dfs(LL u, LL f) {for (LL i : G[u]) {if (i == f)continue;dfs(i, u);dp[u][0] += max(dp[i][0], dp[i][1]);// if(checksqrt(a[i]*a[u])){  //需要先把所有子节点的dp状态都更新完了,确保dp[i][0/1]都是最优的,才能更新这里,不然只有7%,别问我怎么知道的//     dp[u][1] = max(dp[u][1], dp[u][0] - max(dp[i][0], dp[i][1]) + dp[i][0] + 2);// }}for (LL i : G[u]) { if (i == f)continue;if(checksqrt(a[i]*a[u])){ dp[u][1] = max(dp[u][1], dp[u][0] - max(dp[i][0], dp[i][1]) + dp[i][0] + 2);}}
}
int main() {LL n;cin >> n;for (LL i = 1; i <= n; i++) {cin >> a[i];}for (LL i = 1; i < n; i++) {LL u, v;  cin >> u >> v;G[u].push_back(v);G[v].push_back(u);}dfs(1, -1);cout << max(dp[1][0], dp[1][1]) << "\n";
}

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

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

相关文章

【Unity】调整Player Settings的Resolution设置无效

【背景】 Build时修改了Player Settings下的Resolution设置&#xff0c;但是再次Building时仍然不生效。 【分析】 明显是沿用了之前的分辨率设定&#xff0c;所以盲猜解决办法是Build相关的缓存文件&#xff0c;或者修改打包名称。 【解决】 实测修改版本号无效&#xf…

maya常用技巧

目录 打开脚本编辑器 打开脚本编辑器 打开Maya软件后&#xff0c;从窗口菜单栏选择“General Editors”&#xff0c;再选择“Script Editor”&#xff0c;即可打开Maya的脚本编辑器。这是最基本的打开方式&#xff0c;适用于大多数用户。 二、使用快捷键打开 在Maya的快捷键…

每天30分钟python(第一天)

1.input 1.规则 input输入的是字符串 2.print打印规则&#xff1a; 整数不能与文字一起打印&#xff0c;但是字符串可以&#xff0c;所以将文字转换为字符串即可 print("小明今年"str(5)"岁了") 代码实践&#xff1a; 错误代码&#xff1a; # 实现 …

Qt实现TFTP Server和 TFTP Client(二)

3 实现 3.1 Core Core模块包括下面4个类&#xff1a; TFTPBaseUdpTFtpClientFileTFtpServerFile 3.1.1 TFTP TFTP类实现了TFTP协议。 3.1.1.1 TFTP定义 class TFtp { public:TFtp();enum Code {RRQ 0x0001,//Read requestWRQ 0x0002,//Write requestDATA 0x0003…

Windows服务器性能监控

Windows服务器操作系统设计用于运行在客户端-服务器架构内的服务器上&#xff0c;这些服务器通常设计用于处理繁重的工作负载&#xff0c;并作为企业中涉及的大多数软件操作的骨干。因此&#xff0c;为了防止由于性能问题而导致的任何服务损失并保持操作的无缝流&#xff0c;Wi…

如何评价代码质量

设计模式专栏&#xff1a; http://t.csdnimg.cn/4Mt4u 目录 1.引言 2.可维护性(maintainability) 3.可读性(readability) 4.可扩展性(extensibility) 5.灵活性(flexibility) 6.简洁性(simplicity) 7.可复用性(reusability) 8.可测试性(testability) 9.总结 1.引…

Linux-进程控制(进程创建、进程终止、进程等待)

一、进程创建 1.1 fork函数介绍 在命令行下我们可以通过 ./ exe文件 来创建一个进程&#xff0c;通过fork函数&#xff0c;我们可以通过代码的形式从一个进程中创建一个进程&#xff0c;新进程为子进程&#xff0c;原进程为父进程&#xff0c;子进程在创建时&#xff0c;会与…

教育建筑智慧能源管理平台解决方案【新型电力系统下的绿色校园能源管理平台】

一、行业特点 1.建筑类型多&#xff1a;集教学、科研、生活于一体&#xff0c;占地面积大&#xff0c;建筑类型多&#xff0c;功能划分复杂。 2.供电可靠性要求高&#xff1a;教育建筑中的高层建筑、图书馆、实验楼等特级和一级负荷比较多&#xff0c;一旦发生故障会危及生命…

STM32 ESP8266模块的曲折探索

这是本文的配套资料&#xff0c;最终工程请参考 新_ESP8266资料\stm32f103成功移植的项目 【免费】stm32f103c8t6esp8266资料资源-CSDN文库 一、等到了ready 产品参数 我使用的是ai-thinker的esp8266-01s&#xff0c;以下为产品规格书 引脚定义&#xff1a; 依据引脚定义&…

ssh -p 2222怎么进docker容器

要通过SSH和端口2222进入Docker容器&#xff0c;您需要确保容器内已经安装并运行了SSH服务器&#xff0c;并且已经将宿主机的2222端口映射到容器的SSH端口&#xff08;通常为22&#xff09;。以下是一般的步骤&#xff1a; 1、启动容器时映射端口&#xff1a; 当您启动容器时…

android studio忽略文件

右键文件&#xff0c;然后忽略&#xff0c;就不会出现在commit里面了 然后提交忽略文件即可

Linux查询日志常用命令整理

Linux查询日志常用命令整理 1. 实时查看日志2. 查看历史日志的最后几行3. 根据关键词过滤日志4. 查询指定路径下的所有日志文件5. 当日志文件过大时&#xff0c;查看开头部分6. 筛选出指定时间范围内的日志7. 分页查看日志8. 将查询到的日志输出到另一个文件9. 查看过去某一时间…

如何在VS Code上搭建 C/C++开发环境

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、什么是VScode VScode&#xff08;Visual Studio Code&#xff09;是一款由微软开发的免费开源的轻量级代码编辑器。它…

AI绘画自动生成器有哪些?

AI绘画自动生成器近年来发展迅速&#xff0c;以下是一些知名的和受欢迎的AI绘画工具&#xff1a; DALL-E2 - 由OpenAI开发&#xff0c;可以依据文本描述生成高度逼真的图像。Deep Dream Generator - 使用深度学习技术对上传的图片进行艺术化处理。Artbreeder - 提供图像合成和…

鸿蒙 ohpm 的异常报错

解压安装 ohpm , 进入 command-line-tools/ohpm/bin 目录执行 ohpm -v , 一直提示未初始化异常&#xff1a;ERROR: ohpm has not been initialized yet. Execute the init script to initialize it first. google搜索发现都是让配置环境变量、执行init脚本&#xff0c;尝试后…

Python操作Sqlite的简单封装

文章目录 一、安装依赖二、配置文件三、实现类 一、安装依赖 pip install numpy二、配置文件 utils.config.py ############### 233 SQLITE Configuration ############### SQLITE_PATH ./mysqlite.db三、实现类 utils.PostGreOp.py # encoding: utf-8import json import …

如何成功将自己开发的APP上架到应用商店

随着移动应用市场的蓬勃发展&#xff0c;开发一款优秀的APP已成为许多企业和个人的首要选择。然而&#xff0c;成功上架并有效推广APP至关重要。本文将逐步介绍完整的上架流程&#xff0c;包括准备所需材料、注册开发者账户、进行APP备案、提交审核以及上架成功后的推广和维护。…

maya 重定向 pycharm运行

目录 maya sdk下载: 添加sdk 依赖库: pycharm连接 maya 测试ok maya重定向脚本 插

电子商务营销中大数据分析|电商大数据采集API接口的应用

随着经济的不断发展&#xff0c;网络信息技术不断加强&#xff0c;电子商务和大数据的蓬勃发展极大地方便了人们的生活。本文章主要阐述大数据分析与电商营销的含义、大数据分析在电子商务营销中的应用&#xff0c;以及该应用的作用和存在哪些不足及解决方法。探究大数据分析在…

【MATLAB源码-第14期】基于matlab的2ASK的误码率BER仿真以及原信号调制信号解调信号波形展示。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 幅度偏移调制&#xff0c;又称幅移键控&#xff0c;幅度键移&#xff08;英语&#xff1a;Amplitude-shift keying&#xff0c;ASK&#xff09;是通过载波的幅度变化来表示数字信号的一种幅度调制方式。在一个ASK系统中&…