美团 2023年春招 JAVA后端开发方向

2023-10-27

分糖

时间限制:3000MS
内存限制: 589824KB
题目描述:
小美因乐于助人的突出表现获得了者师的嘉奖。
老师允许小美从一堆n个编号分别为1,2,..,n的糖果中选择任意多个糖果作为奖励(每种编号的果各一个),
但为了防止小美一次吃太多糖果有害身体健康,老师设定了个眼制: 
如果选择了编号为i的果,那么就不能选择编号为 i-1,i-2,i+1,i+2的四个糖果了。
在小美看来,每个糖果都有一个对应的美味值,小美想让她选出的糖果的美味值之和最大!
作为小美的好朋友,请你帮帮她!

输入描述

第一行一个整数n,表示糖果数量。
第二行n个整数a1,a2,...,an,其中ai表示编号为i的糖果的美味值。
1<=n<=50000,1<=ai<=10000

输出描述

输出一行一个数,表示小美能获得的糖果美味值之和最大值。

样例输入

7
3 1 2 7 10 2 4

样例输出

14

思路:设定dfs(idx,sum),i表示当前考虑第i个糖果,sum表示当前美味值的和。

第一种情况:每个位置都可以不选,那么对应的下一个状态就是dfs(i+1,sum)。

第二种情况:当满足满足used[i-2] = used[i-1] =false时,那么就可以选当前糖果,即令used[i]=true,下一个状态为dfs(i+1,sum+a[i]),状态退出时置used[i]=false。

#include<iostream>
using namespace std;

const int maxn = 5e4 + 7;
int n, a[maxn], global_max;
bool used[maxn];

void DFS(int idx, int sum){
	if(idx == n){
		global_max = max(global_max, sum);
		return;
	}
	bool can_use = true;
	for(int i = max(idx - 2, 0); i < idx; ++ i){
		can_use &= (! used[i]);
	}
	if(can_use){
		used[idx] = true;
		DFS(idx + 1, sum + a[idx]);
		used[idx] = false;
	}
	DFS(idx + 1, sum);
}

int main(){
	cin >> n;
	int idx;
	for(idx = 0; idx < n; ++ idx){
		cin >> a[idx];
	}	
	DFS(0, 0);
	cout << global_max;
	return 0;
} 

有一个剪枝优化的方法即,当我们考虑i号糖果时,如果剩下的所有糖果都考虑了(显然这不可能,因为并不满足当选择j时不选择j-1,j-2,j+1,j+2),但是如果剩下的都选了还不能大于当前得到的最大值,那很显然这种情况可以直接不考虑了,因为及时考虑了也不可能是答案。

#include<iostream>
using namespace std;

const int maxn = 5e4 + 7;
int n, a[maxn], rest[maxn], global_max; //rest[i] 除去0-i-1部分即i-n-1部分的和 
bool used[maxn];

void DFS(int idx, int sum){
	if(sum + rest[idx] <= global_max){
		return;
	}
	if(idx == n){
		global_max = max(global_max, sum);
		return;
	}
	bool can_use = true;
	for(int i = max(idx - 2, 0); i < idx; ++ i){
		can_use &= (! used[i]);
	}
	if(can_use){
		used[idx] = true;
		DFS(idx + 1, sum + a[idx]);
		used[idx] = false;
	}
	DFS(idx + 1, sum);
}

int main(){
	cin >> n;
	int idx, prefix_sum = 0, sum = 0;
	for(idx = 0; idx < n; ++ idx){
		cin >> a[idx];
		sum += a[idx];
	}	
	for(idx = 0; idx < n; ++ idx){
		rest[idx] = sum - prefix_sum;
		prefix_sum += a[idx];
	}
	DFS(0, 0);
	cout << global_max;
	return 0;
} 

春游

时间限制:3000MS
内存限制: 589824KB
题目描述:
小美因乐于助人的突出表现获得了者师的嘉奖。
老师允许小美从一堆n个编号分别为1,2,..,n的糖果中选择任意多个糖果作为奖励(每种编号的果各一个),
但为了防止小美一次吃太多糖果有害身体健康,老师设定了个眼制: 
如果选择了编号为i的果,那么就不能选择编号为 i-1,i-2,i+1,i+2的四个糖果了。
在小美看来,每个糖果都有一个对应的美味值,小美想让她选出的糖果的美味值之和最大!
作为小美的好朋友,请你帮帮她!

输入描述

第一行两个整数n和m,表示小美的巧克力数量和小美的询问数量
第二行n个整数a1,a2,...,an,表示n块正方形巧克力板的边长。注意你不能将巧克力板进行拆分。
第三行m个整数q1,q2,...,qm,第i个整数qi表示询问: 如果小美选择多少块巧克力板?
(不考虑体积影响,我们认为只要质量满足要求,巧克力板总能塞进包里)
1<=n,m<=50000,1<=ai<=10^4,1<=qi<=10^18

输出描述

输出一行m个整数,分别表示每次询问的答案

样例输入

5 5
1 2 2 4 5
1 3 7 9 15

样例输出

1 2 3 4 5

思路:我们先单看某一个查询qi,要想装最多的块数,不考虑体积只考虑体重,那么肯定尽量装重量小的巧克力才能装最多的块数。现在我们看多个查询,我们可以从小到大进行查询,因为一定会满足 大包能装的数量不会小于小包的,因此我们只需要在小包装的基础上,试着装更多块即可,即对查询做一次离线排序后,计算答案,再按照输入顺序排序回去输出答案。

#include<iostream>
#include<algorithm>
using namespace std;

const int max_num = 5e4 + 7;
int a[max_num];

struct Query{
	long long q_value;
	int ori_idx, answer;
};
Query queries[max_num];

int main(){
	int n, m, idx, query_idx, a_idx;
	long long q_value;
	cin >> n >> m;
	for(a_idx = 1; a_idx <= n; ++ a_idx){
		cin >> a[a_idx];	
	} 
	for(query_idx = 1; query_idx <= m; ++ query_idx){
		cin >> q_value;
		queries[query_idx] = Query{q_value, query_idx, 0};
	} 
	
	sort(queries, queries + m, [](Query A, Query B){
		return A.q_value < B.q_value;	
	});
	
	q_value = 0;
	a_idx = 1;
	for(query_idx = 1; query_idx <= m; ++ query_idx){
		while(a_idx <= n - 1 && q_value + a[a_idx + 1] < queries[query_idx].q_value){
			q_value += a[a_idx ++];
 		}
  queries[query_idx].answer = a_idx;
	}
	
	sort(queries, queries + m, [](Query A, Query B){
		return A.ori_idx < B.ori_idx;	
	});
	for(query_idx = 1; query_idx <= m; ++ query_idx){
		cout << queries[query_idx].answer << " ";
	}
	return 0;
}

当然,如果读者注意到本题数据描述上的条件,n<=50000,1<=ai<=10^4,1<=qi<=10^18,a的最大和为5*10^8,因此当查询大于这个界限值的时候,很显然所有的巧克力都能装下。

解释器

时间限制:3000MS
内存限制: 589824KB
题目描述:
小美因为自己差劲的表达能力而苦恼,小美想制作一个解释器,这样她可以在无法表达的情况下让解释器
帮她解释程序。好巧不巧小美翻开了编译原理的书,找到了解释器的制作方式,她决定先制作一个书上练
习题中描述的小解释器试试。小美需要诞入一行字符串,其格式为"key1=val1;key2=val2;...;
keyn-1=valn-1;keyn =valn;"(不包含引号)。这样的n对key,value对,其中keyi和vali为第i对
key,value对,且均为仅包含大小写英文字母、数字与斜杠的非空字符串。例如对于字符串
"SHELL=/bin/bash;HOME=/home/xiaomei;LOGNAME=xiaomei;",那么其中包含三对keyvalue对,
以(keyvalue)形式展示分别为(SHELL,/bin/bash)、(HOME,/home/xiaomei)、(LOGNAME,xiaomei)。
接下来,小美的解释器需要接受q次询问,每次询问给出一个仅包含大小写英文字母、数字与斜杠的非空
字符串,如果存在某对key,value对的key值与之相同,那么输出对应的value; 如果存在多对key,value
对的key值与之相同,那么输出其中编号最大的,也即最后那一对的value值;如果一对也不存在,那么输出
EMPTY。

输入猫述

第一行一个字符串S,满足题中所述格式。
接下来一个整数q,表示有q个询问。
接下来q行,每行一个仅包含大小写英文字母、数字与斜杆的非空字符串,分别为S1,S2,...,Sq
依次表示q次询问。
令|S|表示字符串S的长度。
1<=|S|<=50000,0<sum{|si|, i=[1,q]}<=|S|,1<=q<=300,S中至少包含一对key,value对

输出描述

输出q行,每行一个字符串表示答案

输入样例

LOGNAME=default;SHELL=/bin/bash;HOME=/home/xiaomei;LOGNAME=xiaomei;
4
SHELL
HOME
LOGNAME
logname

输出样例

/bin/bash
/home/xiaomei
xiaomei
EMPTY

思路:本题最直观的想法就是对字符串进行分割,首先以';'分割出每一个key-value对,然后对每一个key-value对再以=分割得到key和value,再以哈希表存储。对于 如果存在多对key,value
对的key值与之相同,那么输出其中编号最大的,也即最后那一对的value值,其实不需要特殊考虑,因为在哈希表内,对同一个key的赋值,编号大的value一定会覆盖编号小的。

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;

unordered_map<string, string> key_value;

void add(string str){
	int i, n = str.length();
	for(i = 0; i < n; ++ i){
		if(str[i] == '='){
			string key = str.substr(0, i);
			string value = str.substr(i + 1, n - i);
			cout << key << ":" << value << endl;
			key_value[key] = value;
			break;
		}
	}
}

void analysis_str(string& str){
	int i, start = 0 , n = str.length();
	for(i = 0; i < n; ++ i){
		if(str[i] == ';'){
			add(str.substr(start, i - start));
			start = i + 1;
		}
	}
	if(start < n) add(str.substr(start, n - start));//处理一下如果输入末尾没有;的问题 
}

int main(){
	string str, query;
	int q,  i;
	cin >> str >> q;
	analysis_str(str);
	while(q --){
		cin >> query;
		cout << (key_value.find(query) == key_value.end() ? "EMPTY" : key_value[query]) << endl;
	}
	return 0;
}

当然还有一个快一点的方法,先按照;再按照=划分总共会导致整个串遍历两次,考虑到输入的格式规范:key,value均为仅包含大小写英文字母、数字与斜杠的非空字符串,所以我们可以利用简单的状态机,初始状态为0,当状态为0时,遍历到的字符都是key的部分,而当遇到=时,状态切换到1,当状态为1时 ,遍历到的字符都是value的部分,而当遇到;时,表示已经遍历完了一个key-value对,此时状态切换为0。

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;

unordered_map<string, string> key_value;

int main(){
	string str, query, key;
	int q, i, start = 0, n;
	bool zero_state = false;
	cin >> str >> q;
	n = str.length();
	for(i = 0; i < n; ++ i){
		if(str[i] == '='){
			key = str.substr(start, i - start);
			start = i + 1;
			zero_state = false;
		}else if(str[i] == ';'){
			key_value[key] = str.substr(start, i - start);
			start = i + 1;
			zero_state = true;
		}
	} 
	if(start < n) key_value[key] = str.substr(start, i - start);//处理一下如果输入末尾没有;的问题 
	while(q --){
		cin >> query;
		cout << (key_value.find(query) == key_value.end() ? "EMPTY" : key_value[query]) << endl;
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

美团 2023年春招 JAVA后端开发方向 的相关文章

  • MySQL管理常用工具介绍

    1 mysql 该mysql不是指mysql服务 而是指mysql的客户端工具 e选项可以在Mysql客户端执行SQL语句 而不用连接到MySQL数据库再执行 对于一些批处理脚本 这种方式尤其方便 示例 2 mysqladmin mysql
  • 第一启富金:两大利空压顶 黄金受压收跌

    第一启富金官网显示 全球最大黄金上市交易基金 ETF 截至01月19日持仓量为976 21吨 较上日持平 本月止净增持0 55吨 香港第一金 投资者的注意力仍集中在美联储1月25日至26日的会议上 此前美联储官员暗示 他们将在3月开始加息以
  • Spring-MVC的文件上传下载,及插件的使用(让项目开发更节省时间)

    目录 一 概述 1 介绍 2 讲述 二 上传 三 下载 四 jrebel的使用 五 多文件上传 给我们带来什么收获 一 概述 1 介绍 Spring MVC的文件上传下载是指在Spring MVC框架中实现文件的上传和下载功能 文件上传是指
  • 【Python基础】深拷贝,浅拷贝和赋值

    浅拷贝 在含有多层对象的字典 列表 集合中 浅拷贝只拷贝父对象 不会拷贝父对象内部的可变子对象 语法 copy copy 深拷贝 只要被拷贝对象含有可变子对象 程序就会重新申请一块内存空间把被拷贝对象的值复制一份存放到该内存空间中 语法 c
  • 前端面试话术集锦第 15 篇:高频考点(React常考进阶知识点)

    这是记录前端面试的话术集锦第十五篇博文 高频考点 React常考进阶知识点 我会不断更新该博文 1 HOC 是什么 相比 mixins 有什么优点 很多人看到高阶组件 HOC 这个概念就被吓到了 认为这东西很难 其实这东西概念真的很简单 我
  • JAVA基础day04

    package com atguigu exer 1 创建一个名为TestArray的类 在main 方法中声明array1和array2两个变量 他们是int 类型的数组 2 使用大括号 把array1初始化为8个素数 2 3 5 7 1
  • redis优化-5.redis主从复制问题处理

    1 读写分离 1 1复制数据延迟 Redis复制数据的延迟由于异步复制特性是无法避免的 延迟取决于网络带宽和命令阻塞情况 比如刚在主节点写人数据后立刻在从节点上读取可能获取不到 需要业务场景允许短时间内的数据延迟 对于无法容忍大量延迟场景
  • 动态规划系列之「最长递增子序列的个数」

    673 最长递增子序列的个数 给定一个未排序的整数数组 找到最长递增子序列的个数 示例 1 输入 1 3 5 4 7 输出 2 解释 有两个最长递增子序列 分别是 1 3 4 7 和 1 3 5 7 示例 2 输入 2 2 2 2 2 输出
  • 计算机编程入门先学什么最好?

    看完其他知友的回答 我认为他们的观点过于局限 并没有真正切中问题的要害 我们不妨换个角度 站在更高一层来看这个问题 计算机编程入门先学什么最好 计算机入门最应该学的是 Linux 而非任何的编程语言 这篇文章4600字 有点长 如果你能耐心
  • spark 读取avro文件

    1 引入依赖
  • FastCFS同步复制机制简介

    FastCFS同步复制机制简介 本篇文章转载于 FastCFS 作者 余庆 大佬的 FastDFS分享与交流 公众号 上一篇文章介绍了 FastCFS 采用数据分组的做法 一个数据分组的几个节点 如三个节点即三副本 之间是 Master S
  • ConvTranspose2d 的简单例子理解

    文章目录 参考 基础概念 output padding 简单例子 stride 2 step1 step2 step3 参考 逆卷积的详细解释ConvTranspose2d fractionally strided convolutions
  • 面试题总结------1

    参考自 https vue3js cn interview 1 css渐进增强和优雅降级 渐进增强 针对低版本浏览器进行构建页面 保证最基本的功能 然后再针对高级浏览器进行效果 交互等改进和追加功能达到更好的用户体验 渐进增强观点则认为应关
  • matlab求解最优化问题(数学建模)

    matlab求解最优化问题 数学建模 1 线性规划 matlab中线性规划优化计算方法和实例 在matlab中用于线性规划优化计算的是linprog 函数 公式 x fval exitflag output lambda linprog c
  • C++知识系列:#和##

    总结 是连接字符串的 是粘合成一个名字的 参考 C 中的 和 是干嘛用的
  • 程序员必知的21个命令

    在这篇文章里 我们将要一睹能快速分析文本数据 如日志 报告等 的最方便工具 很多时候 我们需要的数据并不存储在我们的本机上 所以首先 我们要知道如何链接到远程服务器上并使用它 为此 使用SSH最为合适 SSH 即Secure Shell 是
  • 图像隐写分析-Markov特征编程实现

    该特征集是由Shi 1 等人在当时提出的一种新的特征 其思想是DCT系数之间有一定的变化关系 该特征使用马尔可夫转移概率来描述DCT之间的关系 先计算DCT系数水平 垂直 对角方向的差值 使用块内和块间的转移概率作为图像的特征 假设使用F
  • Mybatis执行流程(下)------Dao层详解

    Mybatis执行流程 下 Dao层详解 Mapper简介 上文结尾在项目中发现会用到Dao层的mapper接口和映射文件等 这是因为在之前开发中有很多冗余的工作 比如要实现100个增删查改的方法 除了本身的业务逻辑代码 还要存在开启 提交
  • 矩阵系列:浮点转定点

    浮点转定点是个比较基础的知识点吧 所以作为开篇 简单的举几个小例子 通过例子 相信大家都能掌握它 简单说明一下 浮点包括 符号位 指数位 小数位 浮点的类型包括 单精度浮点数 双精度浮点数 这里用到的是单精度浮点数 单精度浮点数 1位符号位

随机推荐

  • 【100天精通python】Day5:python基础_python 基本语句,流程控制语句

    目录 1 条件语句 1 1 if语句 1 2 if else语句 1 3 if elif else语句 2 循环语句 2 1 for循环 2 2 while循环 3 跳转语句 3 1 break语句 3 2 continue语句 3 3 p
  • 人类早期驯服野生自动驾驶汽车的珍贵史料

    金磊 西风 发自 凹非寺量子位 公众号 QbitAI 从洛杉矶到拉斯维加斯 谁跑第一 谁就能获得100万美元奖金 21年前 美国国防部高级研究计划局 DARPA 局长托尼 特瑟 在一次活动中现场宣布了这么一个决定 并将此命名为 DARPA大
  • Android -- ImageLoader简析

    图片的内存缓存实现 Image Loader库有一个较完整的内存缓存实现 使用者可以根据需要选择已经实现的策略 也可以定制自己项目中需要的策略 内存缓存实现代码在memory和memory impl这两个包中 前者就是规范视图 后者是实现视
  • 【多视几何】对极几何(Epipolar Geometry)基础及OpenCV实现:对极约束、基础矩阵、本质矩阵和单应矩阵

    文章目录 1 对极约束 Epipolar constraint 1 1 基本术语 1 2 数学推导 2 基础矩阵 Fundamental Matrix 3 本质矩阵 Essential Matrix 4 OpenCV中的相关函数 4 1 特
  • jemter安装过程

    一 安装jdk 二 安装Jmeter 1 下载Jmeter 官网地址 http jmeter apache org download jmeter cgi 2 解压Jmeter安装包 配置Jmeter环境变量 按下面变量名和变量值配置Jme
  • 从一道面试题说起:GET 请求能传图片吗?

    作者 沉末 原文地址 https juejin im post 6860253625030017031 前言 曾经遇到的面试题 觉得挺有意思 来说下我的答案及思考过程 首先 我们要知道的是 图片一般有两种传输方式 base64 和 file
  • Linux:20个linux常用命令

    文章目录 20个linux常用命令 1 ls 列出文件list 2 cd 切换目录change directory 3 cp 复制copy 4 mv 移动move 5 rm 移除 删除remove 6 mkdir 创建文件夹make dir
  • 移动IM开源框架对比

    最近在看移动IM相关的资料 然后发现网上有很多的资料 所以在学习过程中 整理了一些笔记 供那些 想了解 移动IM的童鞋一些参考 移动IM技术选型要点 1 协议选型 2 IM 服务器选型 3 协议和IM服务器改造 4 移动IM常见问题以及一些
  • TS的模块化

    TypeScript 模块化 TS中的模块分为外部模块和内部模块 内部模块称为命名空间 内部模块 主要用于组织代码 避免命名冲突 外部模块简称为模块 侧重代码的复用 一个模块里可能有多个命名空间 模块在自身的作用域里执行 而不是在全局作用域
  • 【电气专业知识问答】问:电动机本体温度异常升高如何处理?

    电气专业知识问答 问 电动机本体温度异常升高如何处理 答 1 起因 电动机本体温度异常可能是由于过载 电压低导致过电流 电压高引起铁耗过大 线圈短路或接地 电缆一相断线或接触不良 由于灰尘而导致接触不良等原因 2 处理 应开启备用电动机 停
  • ADXL345测量角度

    include
  • react--umi, 根据权限展示菜单,完成页面权限分配,以及路由鉴权

    umi框架 prolayout布局 access设置菜单权限 initialState全局初始化数据 配合使用 根据后端返回的权限信息 完成菜单的不同的权限的不同展示 1 umi 配合 patlayout 布局 实现根据配置的路由展示菜单栏
  • cocos2d-x2.2.3和android平台环境的搭建

    最开始学习cocos2dx 大多数人可能是被复杂的环境配置过程搞死的 尤其是和Android平台搭建这一块 会把人搞疯 而且各个版本也会有不少的差异 我也是参考了很多才在自己的电脑里搭建好的 仅供参考 是基于cocos2d x2 2 3版本
  • Unity 方向键输入 Input.GetAxis() 和Input.GetAxisRaw(),Vertical 与Horizontal

    GetAxis 是个方法 需要传参数 参数为string类型 参数如下 一 触屏类 1 Mouse X 鼠标沿着屏幕X移动时触发 2 Mouse Y 鼠标沿着屏幕Y移动时触发 3 Mouse ScrollWheel 当鼠标滚动轮滚动时触发
  • ML算法——最优化

    文章目录 数学预备知识 1 最优化问题 2 凸优化 2 1 梯度下降 2 2 牛顿法 2 3 阻尼牛顿法 2 4 拟牛顿法 2 5 总结 数学预备知识 1 最优化问题 最优化问题指的是在给定条件下 找到一个目标函数的最优解 即找到能够使目标
  • ubuntu 开启自启

    开机启动界面 安装chrome浏览器 1 2 wget https dl google com linux direct google chrome stable current amd64 deb sudo apt install goo
  • apache的ab命令做压力测试

    1 最基本的关心两个选项 c n 例 ab c 100 n 10000 http 127 0 0 1 index php c 100 即 每次并发100个 n 10000 即 共发送10000个请求 2 测试结果分析 junjie2 log
  • 图像阈值(opencv_python学习)

    图像阈值 简单阈值 自适应阈值 Otsu二值化 简单阈值 cv threshold 函数是 OpenCV 中用于应用阈值处理的函数 具体的语法如下 ret dst cv2 threshold src thresh maxval type d
  • 前言

    程序猿一枚 喜欢写作 喜欢分享 喜欢音乐 喜欢摄影 爱历史 临近毕业 由于学校教的知识太浅且太散 实在不适合应用于工作中 最近这段时间去了个培训班学习嵌入式开发 学成归来 虽然身边的同窗都纷纷投入社会了 但我还是想要缓一缓 利用一段时间来总
  • 美团 2023年春招 JAVA后端开发方向

    分糖 时间限制 3000MS 内存限制 589824KB 题目描述 小美因乐于助人的突出表现获得了者师的嘉奖 老师允许小美从一堆n个编号分别为1 2 n的糖果中选择任意多个糖果作为奖励 每种编号的果各一个 但为了防止小美一次吃太多糖果有害身