BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #95368同步于 2018/4/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

微软笔试题

b1196027787
2018/4/2镜像同步82 回复
关于第一题: 有童鞋说暴力过了,也有童鞋说暴力可能超时。不过我知道当时那个代码错在了哪儿了。但是目前还只是暴力的。用空间换时间的做法。@zn950213 童鞋已经做出来了。[点这里](https://bbs.byr.cn/#!article/ACM_ICPC/95466) 下面贴出来的是修改之前过不了的代码。就是用一个变量t标记一趟不需要拔掉的树。 ``` int numOfDays(int numOfPlants, int plantsHeights[]){ bool quit = false; int ret = 0; int pre = 1; int t = 1; while(!quit){ quit = true; ret++; for(int i = 1; i < numOfPlants;i++){ if(plantsHeights[i] <= plantsHeights[i-1]){ plantsHeights[t++] = plantsHeights[i]; quit = false; } } if(pre == t){ quit = true; } pre = t; t = 1; numOfPlants = t; } return ret; } ``` 第二题:按照@yuanfang 说的《算法设计》Kleinberg, Tardos的,屈婉玲教授有翻译。同时b站上也有北大的算法公开课。[下载这本书](https://download.csdn.net/download/lilynothing/10326145),[答案](https://download.csdn.net/download/lilynothing/10327515) 在这本书的动态规划的课后练习题的第2题就是这道题。我根据答案提示,写了如下的代码,但是很有可能还是18/19,因为已经有童鞋这么做了。关于第一天能不能选择hard的task,我觉得这是需要和第二天一起考虑的。 ``` int maxOfSalary(int numOfDays,vector< vector<int> > tasklist){ if (numOfDays == 0){ return 0; } //int x = taskList[0][1], ans = taskList[0][1], y = 0; int dp[numOfDays]; dp[0]= tasklist[0][0]; dp[1]=max(tasklist[1][1], tasklist[0][0]+tasklist[1][0]); for (int i = 2; i<numOfDays; i++){ dp[i]=max(dp[i-2]+tasklist[i][1], dp[i-1]+tasklist[i][0]); } return dp[numOfDays-1]; } ``` --------------------------我是分割线-------------------------------------------------------------- 今天晚上做微软的题目,有一道题目硬是过不了,想求大佬指教。 题目一: 题意:有一组数组,每次遍历一次数组,遇到一个比它左边的数大的数就标记,然后遍历一遍之后,删除那些标记的值。然后不断重复,问需要多少次能结束这样的操作,也就是是一个非递增数组?。 example: input:〔3,6,9,8〕 output:2 解释:第一趟,标记6(因为6大于3)和9(9大于6)。然后删除6.9剩下3.8,只需要一趟就可以标记8,然后删除,最后剩下3一个数。 我做了当时给出的这个例子过了,但是其它的是0/18。 题目二: 题意:一个实习生一天可以选择easy,ghard两个任务中的一个做,也可以一个也不做,两种任务每天的报酬不一样。同时需要注意的是如果想要连续两天以及两天以上都选择hard的话,那么选择hard的前一天必须一个任务也没做。(原句 he choose a hard work on days when and only when he didnot do any work on the previous day.)要求怎么样选择任务能拿到最大报酬。 example: input:days:4, tasklist: [[1.2].〔4.10〕,[20.21],[2.23]] output:33 解释: 第二天和第四天选择hard。 通过『我邮2.0』发布 原书答案:
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
b1196027787机器人#1 · 2018/4/2
第一题想的直接暴力,但是给的两个可见测试过了,但其余的都没过。第二题想着类似于动态规划,但是18/19,另一个不知道是哪一个用例没过。关于输入数据范围都考虑了。还是没找到。求指导。 第二题:18/19 if (numOfDays == 0){ return 0; } int x = taskList[0][1], ans = taskList[0][1], y = 0; for (int i = 1; i<numOfDays; i++){ ans = max(x + taskList[i][0], y + taskList[i][1]); y = x; x = ans; } return ans; 通过『我邮2.0』发布 第一题:0/18(忘了总用例多少了,记得18,不过好像15)之前好像没传上来图, 这个代码给的两个test都过了,但是一提交发现0/15
chen0yi机器人#2 · 2018/4/2
大神挺厉害,表示看题看了半天只看懂一道,还不会做,其他的懒得百度翻译就交卷了
Biuuuuuuuu机器人#3 · 2018/4/2
第一个保证可以结束吗
Hogwarts机器人#4 · 2018/4/2
是不是需要没有相邻相同值 【 在 Biuuuuuuuu (Biuuuuuuuu) 的大作中提到: 】 : 第一个保证可以结束吗
Hogwarts机器人#5 · 2018/4/2
还是说无法标记就over
asif12机器人#6 · 2018/4/2
我和楼主结果一样。莫不是前面一道Python写的?室友说他c++就暴力过了。
ly1021机器人#7 · 2018/4/2
第一题我是先从头找逆序,找到非逆序的就停止并且记下下标,如果没到头就加一,否则结束,然后继续往后遍历,出现逆序且大于之前标记的值就加一。 最后一题时间不太够了,写了暴力递归,动态规划应该能做
ly1021机器人#8 · 2018/4/2
但是第一题最后是13/15好像
b1196027787机器人#9 · 2018/4/2
我是C++呀 【 在 asif12 (长恨安歌) 的大作中提到: 】 : 我和楼主结果一样。莫不是前面一道Python写的?室友说他c++就暴力过了。 通过『我邮2.0』发布