广联达5.11 秋招提前批C++笔试分享

时间是2小时,20道基础知识选择+40道行测选择(其实如果认真做真的挺消耗时间的)+一道编程题
选择题的套路大家都懂,我也记不住,不多赘述

编程题大概是这样的:
有n个(1e5)馅饼,各自有一个位置xi(范围1e9)
你每次可以吃掉长度为k(题目给定)位置范围内的所有馅饼,也就是说假如你从y开始吃,那就可以把[y,y+k]范围内所有馅饼吃掉
你总共可以吃两次,问最多可以吃掉多少馅饼?

比如说:
比方说n=7 k=1  位置是1 5 2 3 1 5 4
那最多可以吃到6个
选择吃[1,2]和[4,5]里面的

个人思路分享:
当时行测消耗了太多时间,没有认真写,不过后来仔细想了下,思路如下
既然是吃两次,那么一个常见的套路就是枚举分割点+前后前缀最大值
当然,因为位置范围太大,我们要在n上做枚举和前缀
前缀最大值的时候用类似于滑窗的思路记录,算出只吃当前位置左侧的馅饼的话最多能吃几个,这是有一个递推性质的(即算出当前位置结尾能吃几个,与前一个位置的最大值比较取最大值)
向左向右各处理一遍,然后枚举分割点,那就能知道当前 在分割点左侧吃+在分割点右侧吃 总共能吃多少个(敢这样做当然也是基于这两次不重叠的吃肯定是最佳的)
至于滑窗的思路嘛,简单的讲就是拿个什么容器,每次把新的推到后面,然后检查前面的数字和新位置相差是否大于k,大于了就弹掉,直到小于等于k

我也看到说有用dp做的,但是没搞懂咋搞,欢迎会用dp写的小伙伴教教我

欢迎讨论,大家一起加油
#广联达##笔试题目##笔试题型##秋招##提前批##C/C++##校招#
全部评论
楼主我又来啦,今晚又看了看这道题,用动态规划做了,感觉应该没啥问题,不知道能不能ac #include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { int n; cin>>n; int k; cin>>k; vector<int> pos(n); for(int i=0;i<n>>pos[i]; } //先对pos排序 sort(pos.begin(),pos.end()); int l=0,r=0; vector<int> cover(n); //双指针法,求出cover[0..n-1] //cover[i]表示在pos中下标i之后(包括i)共有多少个馅饼与pos[i]的距离在k之内 //比如pos: 1 1 2 3 4 5 5 //如果k=1,则对应的cover: 3 2 2 2 3 while(l<n>> dp(n); for(int i=0;i<n>=0;i--) { for(int j=1;j<3;j++){ /*如果i+cover[i]==n并且必须恰好要有2次选择吃馅饼, 说明此时这个馅饼一定不能选择吃 否则的话,假如我们选择吃它,就会剩下一次必须选择吃馅饼的机会 但却没有馅饼可吃了,所以直接dp[i][j]=dp[i+1][j]*/ if(i+cover[i]==n&&j==2){ dp[i][j]=dp[i+1][j]; } /*如果i+cover[i]==n并且必须恰好要有1次选择吃馅饼, 说明pos[i]这个馅饼一定要选择吃,因为这样会吃完pos[i]以及之后 的所有馅饼,一定是最多数量,直接dp[i][j]=cover[i]即可 */ else if(i+cover[i]==n&&j==1){ dp[i][j]=cover[i]; } /*如果i+cover[i]</n></n></int></n></int></vector></algorithm></iostream>
点赞 回复 分享
发布于 2022-05-18 23:32
纠正一下( 少敲了两个数字): //如果k=1,则对应的cover: 3 2 2 2 3 2 1
点赞 回复 分享
发布于 2022-05-18 23:34
麻烦问一下行测等题可以修改嘛,比如说一些消耗时间长的先简单选一下,做完编程后再去研读
点赞 回复 分享
发布于 2022-05-18 11:17
我的想法就是把所有馅饼的位置用一个数组记录下来,然后第一遍遍历计算吃掉最多的区间的馅饼,然后相应位置改成0。第二遍第一遍,然后两次相加就是吃的最多的馅饼。但是只过了30%
点赞 回复 分享
发布于 2022-05-15 19:12

相关推荐

秋盈丶:后续:我在宿舍群里和大学同学分享了这事儿,我好兄弟气不过把他挂到某脉上了,10w+阅读量几百条评论,直接干成精品贴子,爽
点赞 评论 收藏
分享
评论
3
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务