A. A+B Problem
给定两个正整数 和,求。
数据范围:
题解:高精度加法。
时间复杂度:
B. Stock Market
给定一个长度为 的数组,求这个数组绘制的直方图中最大的矩形面积。
数据范围:
样例输入:
1 | 7 |
样例输出:
1 | 12 |
样例说明:选择区间,矩形宽度为 3,高度为 4,面积为 12。
题解:单调栈。
创建一个栈储存直方图中的矩形,每个矩形用两个参数表示:
height:矩形的高度,即该范围内的最小值width:矩形的宽度,即该范围的长度
为了保证所有矩形合法,这是一个单调栈,即栈中的矩形 height 严格递增。
从左到右考虑直方图中的每一个元素:
- 如果 大于栈顶元素的
height,则目前栈内的矩形均合法,并且新增一个更高的矩形height = a[i], width = 1,将其入栈 - 如果 小于等于栈顶元素的
height,则目前栈内height大于等于 的矩形均变为非法。- 将他们出栈,计算出栈的矩形的有效面积,更新最大值
- 考虑一个例子:即将出栈
height1, width1,height2, width2两个矩形,根据单调栈有height1 > height2,则矩形 1 的有效面积为height1 * width1;将矩形 1 的高度压缩到height2,则两个矩形一样高,可以合并为一个矩形,其面积为height2 * (width1 + width2),作为矩形 2 的有效面积。 - 因此,记录已经出栈的矩形总宽度
totalWidth,则目前矩形的有效面积为height[i] * (totalWidth + width[i]),更新最大值 - 最后,将这些出栈矩形的高度全部压缩至
a[i],则新增一个矩形height = a[i], width = totalWidth + 1,将其入栈
最后,直方图中的元素已全部考虑完毕,但是栈中可能还有剩余的矩形,按上述第二种情况处理即可。
时间复杂度: - 每个元素最多被处理两次,一次入栈,一次出栈
对样例进行模拟:
| 栈 | 出栈元素 | totalWidth | 出栈矩形面积 | ||
|---|---|---|---|---|---|
| 1 | 6 | (6, 1) | |||
| 2 | 2 | (6, 1) | 0 | 6*1=6 | |
| 2 | 2 | (2, 2) | 1 | ||
| 3 | 5 | (2, 2), (5, 1) | |||
| 4 | 4 | (2, 2) | (5, 1) | 0 | 5*1=5 |
| 4 | 4 | (2, 2), (4, 2) | 1 | ||
| 5 | 5 | (2, 2), (4, 2), (5, 1) | |||
| 6 | 1 | (2, 2), (4, 2) | (5, 1) | 0 | 5*1=5 |
| 6 | 1 | (2, 2) | (4, 2) | 1 | 4*(2+1)=12 |
| 6 | 1 | (2, 2) | 3 | 2*(2+3)=10 | |
| 6 | 1 | (1, 6) | 5 | ||
| 7 | 6 | (1, 6), (6, 1) | |||
| - | - | (1, 6) | (6, 1) | 0 | 6*1=6 |
| - | - | (1, 6) | 1 | 1*(6+1)=7 |
C. The Longest Increasing Subsequence
给定 个任务,每个任务于 时刻到达,需要 时间完成,优先级为( 为高优先级, 为低优先级)。
CPU 的处理模式为:将任务按照优先级分为两个队列,高优先级队列和低优先级队列,每次从高优先级队列中选择最早到达的任务执行,如果高优先级队列为空,则从低优先级队列中选择最早到达的任务执行。
求每个任务的完成时刻。
数据范围:
样例输入:
1 | 3 |
样例输出:
1 | 6 2 10 |
题解:模拟即可。
在每一时刻:
- 将所有 的任务加入各自对应的队列
- 如果高优先级队列为空,且低优先级队列非空,弹出低优先级队列中最早到达的任务执行
- 如果高优先级队列非空,弹出高优先级队列中最早到达的任务执行
- 如果两者都为空,说明当前时刻没有任务到达,跳到下一个任务到达的时刻
时间复杂度: - 最坏情况下每次都要遍历所有任务
D. Mira - The Dragon Slayer
比 A 更简单的签到题。