广联达5.11 秋招提前批C++笔试分享
时间是2小时,20道基础知识选择+40道行测选择(其实如果认真做真的挺消耗时间的)+一道编程题
选择题的套路大家都懂,我也记不住,不多赘述
编程题大概是这样的:
有n个(1e5)馅饼,各自有一个位置xi(范围1e9)
你每次可以吃掉长度为k(题目给定)位置范围内的所有馅饼,也就是说假如你从y开始吃,那就可以把[y,y+k]范围内所有馅饼吃掉
你总共可以吃两次,问最多可以吃掉多少馅饼?
你每次可以吃掉长度为k(题目给定)位置范围内的所有馅饼,也就是说假如你从y开始吃,那就可以把[y,y+k]范围内所有馅饼吃掉
你总共可以吃两次,问最多可以吃掉多少馅饼?
比如说:
比方说n=7 k=1 位置是1 5 2 3 1 5 4
那最多可以吃到6个
选择吃[1,2]和[4,5]里面的
那最多可以吃到6个
选择吃[1,2]和[4,5]里面的
个人思路分享:
当时行测消耗了太多时间,没有认真写,不过后来仔细想了下,思路如下
既然是吃两次,那么一个常见的套路就是枚举分割点+前后前缀最大值
当然,因为位置范围太大,我们要在n上做枚举和前缀
前缀最大值的时候用类似于滑窗的思路记录,算出只吃当前位置左侧的馅饼的话最多能吃几个,这是有一个递推性质的(即算出当前位置结尾能吃几个,与前一个位置的最大值比较取最大值)
向左向右各处理一遍,然后枚举分割点,那就能知道当前 在分割点左侧吃+在分割点右侧吃 总共能吃多少个(敢这样做当然也是基于这两次不重叠的吃肯定是最佳的)
至于滑窗的思路嘛,简单的讲就是拿个什么容器,每次把新的推到后面,然后检查前面的数字和新位置相差是否大于k,大于了就弹掉,直到小于等于k
我也看到说有用dp做的,但是没搞懂咋搞,欢迎会用dp写的小伙伴教教我
欢迎讨论,大家一起加油
#广联达##笔试题目##笔试题型##秋招##提前批##C/C++##校招#