1. 绘图机器
1.1. 题目描述
绘图机器的绘图笔初始位置在原点(0,0)机器启动后按照以下规则来进行绘制直线。
-
尝试沿着横线坐标正向绘制直线直到给定的终点E
-
期间可以通过指令在纵坐标轴方向进行偏移,offsetY为正数表示正向偏移,为负数表示负向偏移
给定的横坐标终点值E 以及若干条绘制指令,
请计算绘制的直线和横坐标轴以及x=E的直线组成的图形面积。
1.2. 输入描述
首行为两个整数 N 和 E
表示有N条指令,机器运行的横坐标终点值E
接下来N行 每行两个整数表示一条绘制指令x offsetY
用例保证横坐标x以递增排序的方式出现
且不会出现相同横坐标x
取值范围
0<N<=10000
0<=x<=E<=20000
-10000<=offsetY<=10000
1.3. 输出描述
一个整数表示计算得到的面积 用例保证结果范围在0到4294967295之内。
1.4. 用例
输入
4 10
1 1
2 1
3 1
4 -2
输出 12
说明 无
输入
2 4
0 1
2 -2
输出 4
说明 无
1.5. 代码
class Solution:
def __call__(self, offsets: List[List[int]], xrange: int):
x = h = ans = 0
for _x, offset in offsets:
ans += (_x - x) * abs(h)
h += offset
x = _x
ans += max((xrange - x) * abs(h), 0)
return ans
2. 火星文计算
2.1. 题目描述
已知火星人使用的运算符为#、$,其与地球人的等价公式如下:
x#y = 2x+3y+4
x$y = 3*x+y+2
其中x、y是无符号整数
地球人公式按C语言规则计算
火星人公式中,$的优先级高于#,相同的运算符,按从左到右的顺序计算
现有一段火星人的字符串报文,请你来翻译并计算结果。
2.2. 输入描述
火星人字符串表达式(结尾不带回车换行)
输入的字符串说明:字符串为仅由无符号整数和操作符(#、$)组成的计算表达式。
例如:123#4$5#67$78。
用例保证字符串中,操作数与操作符之间没有任何分隔符。
用例保证操作数取值范围为32位无符号整数。
保证输入以及计算结果不会出现整型溢出。
保证输入的字符串为合法的求值报文,例如:123#4$5#67$78
保证不会出现非法的求值报文,例如类似这样字符串:
#4$5 //缺少操作数
4$5# //缺少操作数
4#$5 //缺少操作数
4 $5 //有空格
3+4-5*6/7 //有其它操作符
12345678987654321$54321 //32位整数计算溢出
2.3. 输出描述
根据输入的火星人字符串输出计算结果(结尾不带回车换行)。
2.4. 用例
输入 7#6$5#12
输出 226
说明
7#6$5#12
=7#(36+5+2)#12
=7#25#12
=(27+325+4)#12
=93#12
=293+3*12+4
=226
2.5. 题目解析
有优先级的运算python都实现好了,只需要重写这#$
两个方法就好
2.6. 代码
import re
class NewNumber:
def __init__(self, val):
self.val = val
def __mul__(self, other):
return NewNumber(3 * self.val + other.val + 2)
def __add__(self, other):
return NewNumber(2 * self.val + 3 * other.val + 4)
class Solution:
def __call__(self, s: str) -> int:
s = s.replace('$', '*').replace('#', '+')
s = re.sub('(\d+)', 'NewNumber(\\1)', s)
return eval(s).val
3. 机场航班调度程序
本题过于简单
3.1. 题目描述
XX市机场停放了多架飞机,每架飞机都有自己的航班号CA3385,CZ6678,SC6508等,航班号的前2个大写字母(或数字)代表航空公司的缩写,后面4个数字代表航班信息。
但是XX市机场只有一条起飞跑道,调度人员需要安排目前停留在机场的航班有序起飞。
为保障航班的有序起飞,调度员首先按照航空公司的缩写(航班号前2个字母)对所有航班进行排序,同一航空公司的航班再按照航班号的后4个数字进行排序,最终获得安排好的航班的起飞顺序。
请编写一段代码根据输入的航班号信息帮助调度员输出航班的起飞顺序。
说明:
航空公司缩写排序按照从特殊符号$ & *,0-9,A-Z排序;
3.2. 输入描述
第一行输入航班信息,多个航班号之间用逗号 “,” 分隔,输入的航班号不超过100个。
例如:
CA3385,CZ6678,SC6508,DU7523,HK4456,MK0987
备注:
航班号为6为长度,后4位位纯数字,不考虑存在后4位重复的场景。
输出描述
CA3385,CZ6678,DU7523,HK4456,MK0987,SC6508
3.3. 用例
输入 CA3385,CZ6678,SC6508,DU7523,HK4456,MK0987
输出 CA3385,CZ6678,DU7523,HK4456,MK0987,SC6508
说明 输入为目前停留在该机场的航班号,输出为按照调度排序后输出的有序的航班号
输入 MU1087,CA9908,3U0045,FM1703
输出 3U0045,CA9908,FM1703,MU1087
说明 无
3.4. 代码
solution = lambda x: sorted(x.split(','))
4. 机器人搬砖
4.1. 题目描述
机器人搬砖,一共有 N 堆砖存放在 N 个不同的仓库中,第 i 堆砖中有 bricks[i] 块砖头,要求在 8 小时内搬完。
机器人每小时能搬砖的数量取决于有多少能量格,机器人一个小时中只能在一个仓库中搬砖,机器人的能量格只在这一个小时有效,为使得机器人损耗最小化,应尽量减小每次补充的能量格数。
为了保障在 8 小时内能完成搬砖任务,请计算每小时给机器人充能的最小能量格数。
无需考虑机器人补充能力格的耗时;
无需考虑机器人搬砖的耗时;
机器人每小时补充能量格只在这一个小时中有效;
4.2. 输入描述
第一行为一行数字,空格分隔
4.3. 输出描述
机器人每小时最少需要充的能量格,若无法完成任务,输出 -1
4.4. 用例
输入 30 12 25 8 19
输出 15
说明 无
输入 10 12 25 8 19 8 6 4 17 19 20 30
输出 -1
说明 砖的堆数为12堆存放在12个仓库中,机器人一个小时内只能在一个仓库搬砖,不可能完成任务。
4.5. 题目解析
类似之前几天做过的吃蟠桃、人力分配问题。都是二分法找到能满足条件且最接近的值
4.6. 代码
class Solution:
def check(self, blocks: List[int], power: int) -> bool:
cost = 0
for block in blocks:
cost += block // power + (block % power > 0)
return cost <= 8
def __call__(self, blocks: List[int]):
if len(blocks) > 8:
return -1
max_power, min_power = max(blocks), min(blocks)
ans = max_power
while min_power <= max_power:
mid_power = (min_power + max_power) // 2
if self.check(blocks, mid_power):
ans = mid_power
max_power = mid_power - 1
else:
min_power = mid_power + 1
return ans