【美团春招】后端开发实习生 笔试题目

本文分享了2021年美团春招后端开发实习笔试中的一道题目,涉及小明练琴的最优经验获取策略。作者最初尝试用贪心算法解决,但在实现中遇到错误,最终通过调整算法并结合等差数列求最值解决了问题。文章提供了错误查找的过程和修正后的Java代码。
摘要由CSDN通过智能技术生成

写在前面

这是2021年5月9日,美团春招最后一场笔试“后端开发”实习的题目,4 + 1道编程,至于为什么只写这一道,是因为前两道忘了,后面因为太菜还没来得及看,而这道题卡了我一个小时也没有做出来

第三题

题目描述

小明练琴,他有一个初始状态值x,每天他可以选择练琴或者休息,如果练琴的话会收获经验值x,然后消耗状态值a,如果某休息的话会增加经验值b,一共n天时间,问小明在时间内最多收获多少经验值?
1 <= x, a, b, n <= 10^6

输入顺序为x a b n
官方例子:[10 5 5 3] 结果为25
第一天休息 状态值15 收获0
第二天练琴 状态值10 收获15
第三题练琴 状态值5 收获25

思路复盘

一开始看到这种题想到的肯定是动态规划,而且动态规划肯定是可以做出来的(是否超时就不知道了),但当时觉得动态规划好像有点麻烦,灵光一现,觉得贪心算法似乎可以解决,我之前一直休息,然后把状态值拉高,最后连续练琴就能取到最优解。试了几个没有找到反例,就按照这个思路求解了。
然后就掉坑里出不来了结果一直是通过18%(只过了示例那个解)

错误查找

笔试结束后一直怀疑思路错了,以为贪心是无法求解的,但是在牛客上看到了别人有用贪心法AC的,于是问大佬要了代码,开始分析自己的问题。

问题查找:一开始的求休息天数公式就错了
虽然都是贪心算法,之前一直休息,然后一直训练
但我想的是,休息到最后一天的时候状态值降为零是最优情况,所以求休息天数i的公式时设置的是:

x + b * i = a * (n - i) 推出

i = (a * n - x) / (b)

但是这并不是最优值,而是该用等差求和的公式通过求导找到最大值点

f(i) =[ (x + b * i) + (x + b * i - a * ( n - i - 1)]* (n - i )/ 2

求导后可以得出

i = (2 * b* n +2 * a * n-2 * x - a ) / ( 4 * b + 2 * a )

过程:
在这里插入图片描述

但是i不一定是整数(且向下取整),所以还需要计算i + 1时候的情况,取最大值

Java代码 及 结果

import java.util.Scanner;

public class
2023年3月11日,美团春季招聘笔试中共包含五道编程题。以下是对每道题的简要说明: 1. 题一:这道题要求解决一个数字统计的问题。可能涉及到的知识点包括数据结构、循环和条件判断等。解决问题的思路可能是使用字典等数据结构来保存统计结果,并使用循环逐个读取输入数据并进行统计。 2. 题二:这道题可能是一个字符串处理的问题。需要使用字符串的方法进行操作,如提取、拼接、查和替换等。可能的解决思路包括使用正则表达式、切片和遍历等。 3. 题三:这道题可能涉及到算法和数据结构的知识。可能是一道涉及到数组、链表、树等数据结构的问题。解决思路可能包括遍历、递归、搜索和排序等。 4. 题四:这道题可能是一个动态规划的问题。需要根据给定的条件和规则,通过动态规划的方式求解问题。解决思路包括定义状态和转移方程,使用递推或记忆化搜索进行求解。 5. 题五:这道题可能是一个图论或网络问题。需要根据给定的图或网络结构,解决一个相关的问题。可能涉及到广度优先搜索、深度优先搜索、最短路径等知识。解决思路可能包括使用图或网络的相关算法进行求解。 以上只是对这五道编程题的一些可能情况进行的简要描述,具体的题内容可能会有所不同。希望这些信息能对你有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值