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

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

时间: 2024-08-21 08:26:55

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

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

6月23日英雄会平台发布了一道难度为超5星的微软比赛题目,截止活动结束共有300多名编程爱好者参与线上答题,而最终通过者仅有7人,通过率仅为2%.为什么成绩如此出人意料?是因为题目的英文描述难以理解?还是题目本身的难度太高让很多人望而生畏知难而退? 为此我们诚邀各路英雄豪杰前来切磋探讨,共同发现: 1.解题思路:本次大赛一等奖获得者-大连理工大学学生__newSolar,提供两种解题思路: 2.代码样本:雅虎刷题狂人曹鹏专家的代码将作为样本展示,供学习借鉴: 3.“一起来找茬儿”:在所有答题者中

[转帖]四张王牌加持!阿里云季度营收78亿:增速超亚马逊微软

四张王牌加持!阿里云季度营收78亿:增速超亚马逊微软 目前,已经有上万家企业全面迁移到阿里云上,其中包括飞利浦中国.迅雷.万科物业.百丽.Salesforce 中国.居然之家.大润发.西贝莜面村.虎扑.得到.千寻位置.115 科技.众安保险.网商银行.龙湖地产.振华重工.首汽租车.优信二手车.安联救援等知名企业. https://news.cnblogs.com/n/629719/ 阿里的进度依旧非常快.. 运维还有没有前途 以后的日子 应该如何进步? 了“四张王牌” ——飞天云操作系统.飞天大

2014百度之星资格赛 1001:Energy Conversion(水题,逻辑题)

Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4278    Accepted Submission(s): 1024 Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的

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

1.即使是相同的短信签名与短信正文模板,也需要针对“国内文本短信”与“海外文本短信”分别申请.开始不知道,以为只要申请一次,给国外手机发短信时给api传对应的国家码就行,后来才发现需要分别申请. 2.短信服务web api响应“手机号内容频率限制”错误.这是由于在30秒内向同一手机号多次发送了相同内容的短信,这是腾讯云短信服务的默认限制——“相同内容短信对同一个手机号,30秒内发送短信条数不超过1条”,可以通过“应用配置”的“短信频率配置”修改这个限制. 3.腾讯云短信服务没有提供 .NET C

3星难度-算式填符号

题目: 匪警请拨110,即使手机欠费也可拨通! 为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练! 某批警察叔叔正在进行智力训练: 1 2 3 4 5 6 7 8 9 = 110 请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号).之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法:123+4+5+67-89 是另一个可能的答案. 请你利用计算机的优势,

2017百度之星初赛(A)1001,1005,1006解题报告

1001 小C的倍数问题 纯签到题,求p-1的因数个数,暴力枚举即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 ios::sync_with_stdio(false); 6 int t,p,cnt,n,num; 7 cin>>t; 8 while(t--) 9 { 10 cnt=0; 11 cin>>p; 12 n=p-1; 13 for(int i=1;i*i<=n;+

微软灯管问题(智力题六)

题目: 在房里有三盏灯,房外有三个开关,在房外看不见房内的情况,你只能进门一次,你用什么方法来区分那个开关控制那一盏灯? 解答: 打开一盏灯10分钟,关掉,打开第二盏,进去看看哪盏亮,摸摸哪盏热,热的是第一个打开的开关开的,亮的是第二个开关开的,另一个就是第三个. 版权声明:本文为博主原创文章,未经博主允许不得转载.

好站分享-互联网行业优秀网站分享、干货超多

几个优秀的互联网分享站点,干货不断...! 派代网 http://www.paidai.com 派代网创立于2007年2月8日,定位为中国电子商务驱动器,是目前国内最具影响力.交流最活跃的电子商务行业深度交流平台,用户数已超过四十九万余人,集聚了大量中国电子商务领军企业的创始人和资深行业专家,淘宝天猫大卖家,如王峻涛.刘强东.张国华.李阳.郭峰.孙弘.吕长城.赵迎光等. 派代网致力于促进行业交流.学习.合作,倡导友爱.尊重.分享.互助的业界文化,发扬"拼搏.舍得"的精神,以实际行动促进

.NET Core TDD 前传: 编写易于测试的代码 -- 缝

有时候不是我们不想做单元测试, 而是这代码写的实在是没法测试.... 举个例子, 如果一辆汽车在产出后没完成测试, 那么没人敢去驾驶它. 代码也是一样的, 如果项目未能进行该做的测试, 那么客户就不敢去使用它, 即使使用了也会遇到“车祸”. 为什么要测试/测试的好处 它可以尽早发现bug, 解决bug 它会节省开发和维护一个软件的总成本. 实际上我们在维护软件上付出的成本要远大于在开发时付出的成本. 开发的时候编写单元测试确实会增加一些成本, 但是从长远来看这些测试还是会从维护上降低软件的总成本