6月23日英雄会平台发布了一道难度为超5星的微软比赛题目,截止活动结束共有300多名编程爱好者参与线上答题,而最终通过者仅有7人,通过率仅为2%。为什么成绩如此出人意料?是因为原题的英文描述难以理解?还是题目本身的难度太高让很多人望而生畏知难而退?


为此我们诚邀各路英雄豪杰前来切磋探讨,共同发现:

1. 解题思路:本次大赛一等奖获得者-大连理工大学学生__newSolar,提供两种解题思路;

2. 代码样本:雅虎刷题狂人曹鹏专家的代码将作为样本展示,供学习借鉴;

3.“一起来找茬儿”:在所有答题者中,抽选部分未通过的错误代码,邀你来“找茬”;


题目描述:

在微软云计算服务的机房,有很多机器上跑着一个或者多个的虚拟机。在一段时间里,有很多用户会来请求建立虚拟机,或者把虚拟机关闭。这个时候,一个最重要的问题,是如何把用户的请求分配到不同的机器上。这里我们把实际的问题简化成对CPU的申请。

假定有M台机器用来服务用户,我们把机器编号成0到M。每台机器有多个CPU核,我们把核编号为0到Cm。

当用户在申请资源的时候,会生成一个请求 “申请<k>个核”,并且每个请求编号为m如果我们在现有的机器中能找到一台机器能满足,这台机器的空余的连续的核能满足要求的话,就返回<M, C>作为结果。M是机器的下标,C是申请的第一个核的下标。如果没有找到能满足请求的机器,<-1,

-1>作为结果。

当用户释放资源的时候,生成一个请求”第m个请求的资源释放”。保证一个请求释放最多一次。如果请求没有满足,忽略释放的请求。

输入

第一行是T, 总共的测试的个数

每个测试,第一行给出M 和Q,机器的总数和请求的个数

接下来是M行给出每一台机器的核数 Ci

接下来Q行给出请求。请求两种格式,

1.       A k    表示申请k个核

2.       F m   表示释放第m个请求申请的核

输出

对于每一个测试,首先输出

“Case #i:”  i是测试的标号,从1开始。

接下来对于所有申请的请求,输出m c 或者-1

-1

[限制条件]

1 <= T <= 20

1 <= M <= 100000

1 <= Ci <= 128

1 <= Q <= 1000000

1 <= k <= 128

1 <= m <= M

The number of queries of type 1 is the same

as that of type 2.


题目解析:

考虑到数据范围,共有10W个机器,100W次查询,时间上不足以在每次询问中遍历所有的机器,但考虑到CPU的数量只有128

可以从这里入手加快查询效率。

解法一:

我们维护128个集合,每个集合存储不同的最长连续空闲核数的机器,(eg, 集合1存最长空闲数为1的机器,集合2存最长空闲数为2的机器)。对于每次A询问,申请核数为k,我们只需枚举从k到128的所有集合中机器编号最小的,为了查找效率,我们可以使用

c++STL的set (或者java的TreeSet), 内部是树形结构,每个集合的第一个元素即为最小元素,查找到之后暴力更新这个机器使用情况并把新的机器信息加入到集合中,同时为了F操作保存询问信息。对于F操作相对简单,直接恢复记录的信息并更新机器信息就可以了。

此方法每次询问的复杂度大约为O(128*log(n))。

解法二:

对于每次询问,我们直接从10W个机器下手,为了提高效率可以使用线段树,线段树的每个节点维护当前区间所有机器最长空闲数,对于A查询,申请核数为k,如果当前节点左儿子值>=k,则在左子树中查询,否则在右子树查询,可以很容易在log(n)时间内查询到所需要的机器。其他操作和上一种解法类似。


优秀代码展示:

比赛一等奖获得者Newsolar代码展示(解法一):http://student.csdn.net/mcd/topic/235300/937965

比赛一等奖获得者Newsolar代码展示(解法二):http://student.csdn.net/mcd/topic/235300/937965

雅虎刷题狂人曹鹏专家代码展示:http://student.csdn.net/mcd/topic/235300/937984


“一起来找茬儿”:

在所有答题者中,抽选部分未通过的错误代码,邀你来“找茬”

错误代码一:http://student.csdn.net/mcd/topic/235300/937968

错误代码二:http://student.csdn.net/mcd/topic/235300/937971

错误代码三:http://student.csdn.net/mcd/topic/235300/937972

超5星难度【微软Core allocation】Coding赛题 - 解题思路优秀代码分享,邀你来“找茬儿”相关推荐

  1. 一道仅有7人通过的超5星微软比赛题目-------解题思路优秀代码分享,邀你来“找茬儿”...

    6月23日英雄会平台发布了一道难度为超5星的微软比赛题目,截止活动结束共有300多名编程爱好者参与线上答题,而最终通过者仅有7人,通过率仅为2%.为什么成绩如此出人意料?是因为题目的英文描述难以理解? ...

  2. 猿人学12题超详细解题思路-入门级js(base64编码)

    前言:服务器为了防止获取他们的数据,可谓是使用各种方法,js逆向可以很方便的解析出来一些加密数据,毕竟道高一尺魔高一丈,今天告诉大家袁人学第12题的解题思路,超详细解题思路. 需求:          ...

  3. 战神笔记本电脑自带access吗_战神GX9系列超享windows10搭载微软office2016

    原标题:战神GX9系列超享windows10搭载微软office2016 神舟正式推出了一大波Win10笔记本和台式机,其中包括战神GX9.GX9 Pro以及GX9 Plus三款游戏本,售价分别为29 ...

  4. 如何看待为了进 Google、微软等外企大量刷题?

    来源:https://www.zhihu.com/question/35133069 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删 作者:程墨Morgan https://www.zhihu. ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先

    基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先 转载于:https://github.com/Meowv/Blog 本篇主要使用Entity Framework ...

  6. LeetCode 中等难度 92. 反转链表 II解题思路

    92. 反转链表 II 题目:中等难度 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4-& ...

  7. 腾讯云短信服务使用记录与.NET Core C#代码分享

    1.即使是相同的短信签名与短信正文模板,也需要针对"国内文本短信"与"海外文本短信"分别申请.开始不知道,以为只要申请一次,给国外手机发短信时给api传对应的国 ...

  8. 关于计算机语言的知识正确的是,2019微软认证考试精选模拟题及答案(1.17)

    [导语]2019微软认证考试备考正在进行中,为了方便考生及时有效的备考,那么,无忧考网为您精心整理了2019微软认证考试精选模拟题及答案(1.17),把握机会抓紧练习吧.如想获取更多2019微软认证考 ...

  9. 2022全国职业技能大赛-网络安全赛题解析总结①(超详细)

    2022全国职业技能大赛-网络安全赛题解析总结(自己得思路) 模块A 基础设施设置与安全加固(20分) 模块B 网络安全事件响应.数字取证调查和应用安全(40分) 模块C CTF夺旗-攻击(20分) ...

最新文章

  1. Linux下的CST和UTC时间的区别
  2. python在财务上的应用-Python用于财务工作培训
  3. ffmpeg的中文学习文档
  4. Centos 7 查看内存占用情况相关命令
  5. 使用Redis创建分布式锁
  6. MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索
  7. Mac开发必备工具(二)—— iTerm 2
  8. (转)linux自动备份oracle数据库并上传到备份服务器 脚本实现
  9. freecplus框架-字符串操作
  10. SpringMVC学习(一)SpringMVC入门 、HelloSpringMVC程序、SpringMVC执行原理
  11. node.js 数据库操作工具类封装
  12. MATLAB-图像分割
  13. 利用虚拟打印机截取打印文件并上传到服务器
  14. 疫情防控中小学开学错峰错时返校放学方案
  15. Ubuntu 更改默认浏览器
  16. 读取计算机内存卡,手机内存卡无法读取怎么办 读取手机内存卡详细方法【详细步骤】...
  17. 误删除文件怎么找回呢?
  18. 设置了position: fixed; 并且能够左右滚动 #html #Css
  19. Excel甘特图 Gantt Chart
  20. ICC编译器生成优化报告

热门文章

  1. 服务器axios响应慢,axios请求问题总结
  2. 非稳态导热Matlab诺莫图,第三章非稳态导热讲课.ppt
  3. 《Python核心编程》第1章答案
  4. android发布市场比较
  5. 数值计算方法--线性方程组的数值解法(3) 追赶法(Thomas),选择主元(Pivoting),求逆(Inversion)
  6. 车规级FRAM满足汽车电子可靠性和无迟延要求
  7. MQ系列传感器电压与浓度转换关系
  8. 使用mongoDB初体验
  9. 计算两个日期之间的天数
  10. 现金贷、信用贷、消费贷小贷系统后台、现金贷、消费贷、信用贷、助学贷、旅游贷、装修贷、准入授信 、贷款申请、产品授信、合同管理、放款审批、放款登记、还款管理、贷后检查、贷后预警、贷款结项、Axure原型