巨硬校招第一次笔试 6号
1、给定预算,最大的填坑长度
...xxx...x..xxx
给定7,返回5,解读:第一个长坑3,填完开销是4;第三个长坑,仅能填2长度,花光剩下的3;
'x'表示坑,n 长度的坑的填坑代价是 n+1 ,则给定 k 预算下,最大的填坑长度;
解题思路:
堆+贪心
每一轮选出最长的坑(大根堆)中,根据预算可以填上的长度,
理由是:保证代价中多余的1在整体代价中占比最小,就是贪心的基本思路;
2、数组中的所有红球贴贴需要的最小交换次数
WWWRRWRWR
-> WWWRRWRRW
-> WWWRRRWRW
-> WWWRRRRWW
'W'指白球,'R'指红球;仅可相邻位置交换;
解题思路:
模拟 + 前缀和
- 首先遍历找到所有红球的位置,并保存到数组pos中;
- 计算前缀和数组pre[],其中每个位置i对应值,指的是 当把i位置之前的所有红球和i位置的红球紧挨所需要的步数
pre[i] = pre[i - 1] + (pos[i] - pos[i - 1] - 1) * i; - 计算前缀和数组post[],其中每个位置i对应值,指的是 当把i位置之后的所有红球和i位置的红球紧挨所需要的步数
post[i] = pre[i + 1] + (pos[i + 1] - pos[i] - 1) * (len - i); - 迭代一遍,计算最小的pre[i]+post[i];
3、患者能否全都能看上病
医生的预约时间是1~S,每个患者i对应两个时间点可以就医,分别存放在t1[i] , t2[i],且时间点均位于1~S之间,患者个数等于时间点个数,
当前患者的预约安排是否能全部就诊?
解题思路:
二分图匹配问题,匈牙利算法,患者和时间点的一一对应是否存在;
Tips:患者个数的规模是100000,初步判断DFS会超时;