复健,时间有限题解比较简陋
A. Middle of the Contest
将小时转成分钟,得到起止时间在一天中的分钟数,取平均值即可,复杂度O(1)
。平均值转换会时间的时候注意前导0。
1 |
|
B. Preparation for International Women’s Day
要加起来能被k
整除, 只需要看模k
的余数即可。余数为i
的与余数为k-i
的互补可以被k
整除,通过计数看有多少对能互补。需要注意的是,为余数为0
和k/2
(k为偶数)时,只能同余数的互补,此时计数是偶数个时都能配对,奇数个时能配对的数量是计数 - 1。复杂度O(n + k)
。
1 |
|
C. Balanced Team
单调队列,从小到大添加元素,保证队首和队尾差不超过5,超过了则出队,否则用当前队列大小更新最优解。如果元素x < y
则x
一定比y
先入队,而且能与x
共存的最小值sx
和能与y
共存的最小值sy
有sx <= sy
。使用单调队列,每次入队后进行出队操作,出队完成后队首就是能与入队元素共存的最小值,队列内的元素就是以入队元素为最大值时所有能存在的元素。复杂度O(n)
1 |
|
D. Zero Quantity Maximization
d * a[i] + b[i] = 0
可得d = - b[i] / a[i]
,统计每种d
取值的个数,取最大即可。对于a[i]
为0
的情况需要特殊讨论,如果b[i]
也为0
则此时d
可以取任意值;否则,d
的取值为0
。另外,为了避免浮点误差,不能直接统计d
,而是要统计<a, b>
这个配对;同时,为了归一化,需要将a
与b
同时除以他们的最大公约数,并保证a
是正数。复杂度O(nlog(n))
,log
是因为用了map
来计数。
1 |
|
——
E. K Balanced Teams
与C题思路类似,先得到取每个元素为最大值,能共存的元素有哪些(排过序的数组保留首位指针即可),比如位置为i
的元素最小可共存元素的位置是maxStart[i]
,这样数组里面maxStart[i]
到i
都是可共存元素。问题就转成如何在里面选k
个,让元素尽量多,这样dp即可。dp[i][j]
表示前i
个元素选j
队的最优值,则如果选maxStart[i]
到i
,最优值为dp[maxStart[i] - 1], j - 1] + i - maxStart[i] + 1
;如果不选,最优值为dp[i - 1][j]
;两者取最优得到状态转移方程。另外由于j
只会从j - 1
转移,因此可以用滚动数组节约内存。复杂度O(nk)
。
1 |
|
F1. Spanning Tree with Maximum Degree
直接找到度最大的节点bfs即可,复杂度O(n + m)
。
1 |
|
F2. Spanning Tree with One Fixed Degree
如果从1
的一个分支出发能从另一个分支回到1
,则这些分支划分为同一组,dfs即可得到这些分组。如果一组里面所有分支都被去掉了,则这组里面的节点就无法出现在树里面,因此至少要保留一个。dfs得到有多少这样的组,每组里面取一个分支,剩下还可以取则任意取。这些分支作为bfs的第一步,继续搜下去,按搜索顺序输出即可。非法的情况有:dfs时存在节点没有走到;需要的度数比组数少(此时至少有一组所有分支都被去掉);需要的度数比1
链接的分支多。复杂度O(n + m)
。
1 |
|