当前位置: 首页 > news >正文

【python科目一:生产线系统设计;激光刀切割材料】

 工厂有若干条生产线,可以生产不同型号的产品,要求实现功能如下:1. ProductionLineMgmtSys 初始化生产线和产品的生产周期有num条生产线,编号从0开始periods[i]表示生产一个型号为i的产品所需的生产周期,单位为天2. Produce 在生产线assemblyId上,从日期date开始持续生产型号productId的产品若生产线空闲,开始生产并返回1若生产线正在生产该型号产品,则命令忽略,返回0若正在生产其他型号,立刻切换,返回-1产品完成日期:若某生产线在date开始生产某型号产品,生产周期为period,则日期date+N*period均为「产品完成日期」假设date为2,period为3,则完成日期为5811...生产切换规则:若非在产品完成日期发生切换,则正在生产的产品未完成,废弃不计若在产品完成日期发生切换,则计数,并同时启动下一产品的生产。3. GetProductCount 查询截止date(含),累计完成型号productId的产品数量。生产完成即 产品完成日期<=date
输入输出样例:
["ProductionLineMgmtSys","produce","getProductCount","getProductCount"]
[[2,[1,3]],[0,1,1],[8,1],[9,1]]
[null,1,2,3]["ProductionLineMgmtSys","produce","produce","getProductCount","produce","produce","getProductCount","produce","produce","produce","getProductCount","produce"]
[[5,[1,4,5,8,2,3]],[0,1,0],[1,1,5],[4,0],[5,0,5],[7,0,0],[7,5],[8,1,5],[8,4,0],[9,1,0],[10,0],[1000,4,0]]
[null,1,-1,1,1,-1,2,0,1,-1,7,0]题给代码:
class ProductionLineMgmtSys {public:ProductionLineMgmtSys(int num, const vector<int>& periods){}int Produce(int date, int assemblyId, int productId){}int GetProductCount(int date, int productId){}
};
from typing import List
import copyclass ProductionLineMgmtSys:def __init__(self, num: int, periods: List[int]):
self.produc_line = dict.fromkeys(range(num)) #key:生产线id value:生产产品id
self.produc_number = dict.fromkeys(range(len(periods)), 0) #key:产品id value:生产数量
self.produc_line_product_start_date = dict.fromkeys(range(num)) #key:生产线id value:生产产品开始时间
self.periods = periodsdef produce(self, date: int, assembly_id: int, product_id: int) -> int:
if self.produc_line[assembly_id] == None:
self.produc_line[assembly_id] = product_id
self.produc_line_product_start_date[assembly_id] = date
return 1
elif self.produc_line[assembly_id] == product_id:
return 0
else:
i = 0
while(self.produc_line_product_start_date[assembly_id] + i * self.periods[self.produc_line[assembly_id]] <= date):
i += 1
self.produc_number[self.produc_line[assembly_id]] += i - 1
self.produc_line_product_start_date[assembly_id] = date
self.produc_line[assembly_id] = product_id
return -1def get_product_count(self, date: int, product_id: int) -> int:
product_achive_number = 0
if product_id in self.produc_line.values():
product_id_in_produc_line = [i for i,x in enumerate(self.produc_line.values()) if x == product_id]
#该生产线还在生产对应产品
produc_number1 = copy.deepcopy(self.produc_number)
for assembly_id1 in product_id_in_produc_line:
i = 0
while(self.produc_line_product_start_date[assembly_id1] + i * self.periods[product_id] <= date):
i += 1
produc_number1[product_id] += copy.deepcopy(i - 1)
product_achive_number += copy.deepcopy(produc_number1[product_id])
else:
product_achive_number = copy.deepcopy(self.produc_number[product_id])
return product_achive_numberif __name__ == '__main__':# ms = ProductionLineMgmtSys(2,[1,3])
# p = ms.produce(0,1,1)
# g = ms.get_product_count(8,1)
# g1 = ms.get_product_count(9,1)
#["ProductionLineMgmtSys","produce","produce","getProductCount","produce","produce","getProductCount","produce","produce","produce","getProductCount","produce"]
#
#[[5,[1,4,5,8,2,3]],[0,1,0],[1,1,5],[4,0],[5,0,5],[7,0,0],[7,5],[8,1,5],[8,4,0],[9,1,0],[10,0],[1000,4,0]]ms = ProductionLineMgmtSys(5,[1,4,5,8,2,3])
p1 = ms.produce(0,1,0)
p2 = ms.produce(1,1,5)
g3 = ms.get_product_count(4,0)
p4 = ms.produce(5,0,5)
p5 = ms.produce(7,0,0)
g6 = ms.get_product_count(7,5)
p7 = ms.produce(8,1,5)
p8 = ms.produce(8,4,0)
p9 = ms.produce(9,1,0)
g10 = ms.get_product_count(10,0)
p11 = ms.produce(1000,4,0)
s = 2

某工厂使用激光刀切割材料。激光刀具有开启和关闭两种状态,并可转向和移动。支持指令如下:

O —— 开启激光刀(即 “OPEN”),指令执行后激光刀处于开启状态

C —— 关闭激光刀(即 “CLOSE”),指令执行后激光刀处于关闭状态

M —— 激光刀沿着当前方向前进一段距离(即 “MOV”),若激光刀在开启状态下,会同步进行材料切割,否则只移动不切割

U,D,L,R —— 改变激光刀的前进方向、但不移动(上:U,下:D,左:L,右:R)

给定一块高为 height,宽为 width 的材料。初始时,激光刀位于材料左上角,处于关闭状态,前进方向为朝下 (D)。

激光刀的操作指令依次记录于字符串 operations,所有 M 指令的移动距离依次记录于数组 distances,distances[i] 表示第 i 个 M 指令的移动距离。

请计算完成操作指令后,材料板上被切割出了多少个 1 x 1 的方块。

注意:输入数据保证激光刀始终在材料初始范围内,可在材料边上,即:激光刀的位置 [row, col] 始终满足 0 <= row <= height,0 <= col <= width。

示例 1:

输入:
height = 3
width = 4
operations = “MRMOMDMLMUMCRMODMC”
distances = [1,1,2,1,2,2,1,2]

输出:3

解释:operations 中有 8 个 M,对应的移动距离在数组distances中。
如图所示,激光刀移动的位置顺序 0->1->2->3->…->8 。其中黄色的线是激光刀开启情形下切割的路径。这样最终图中的 3 个阴影位置是切割所得的 1 x 1 方块。
在这里插入图片描述
示例 2:

输入:
height = 3
width = 4
operations = “MRMOMDMLMUMC”
distances = [1,1,2,1,2,2]

输出:0

解释:如图所示,没有切割出 1 x 1 的方块,故返回 0。
注意:下图中切出的是一个 2 x 1 的材料块,不是两个 1 x 1 的方块。
在这里插入图片描述
示例 3:

输入:
height = 3
width = 3
operations = “MROMDMLMUMRMDMRMUMLMC”
distances = [1,2,1,2,1,1,1,1,1,1]

输出:2

提示:

1 <= height, width <= 100
0 <= operations.length <= 10^4
distances.length 等于 operations 中 M 的个数
operations[i] 仅为 ‘O’、‘C’、‘U’、‘D’、‘L’、‘R’、‘M’
一条边可能会被多次切割

解题思路: 判断格子的四条边是否被切割过, 一共有水平边w * (h + 1) ,垂直边 h * (w + 1)

from typing import  Listclass Solution:def __init__(self):self.block_num = 0self.line_h = []self.line_v = []def init_block(self, height, width):self.line_h = [[0 for _ in range(width)]  for _ in range(height + 1)]self.line_v = [[0 for _ in range(height)] for _ in range(width + 1)]for x in range(0, width):self.line_h[0][x] = 1self.line_h[height][x] = 1for y in range(0, height):self.line_v[0][y] = 1self.line_v[width][y] = 1def mv_knife(self, height: int, width: int, operations: str, distances: List[int]):knife_status = 'C'move_command = 'D'command_count = -1cur_x = 0cur_y = 0for command in list(operations):if command == 'O' or command == 'C':knife_status = commandcontinueelif command == 'M':command_count += 1else:move_command = commandcontinueif move_command == 'U':next_y = cur_y - distances[command_count]if knife_status == 'O':for position in range(next_y, cur_y):self.line_v[cur_x][position] = 1cur_y = next_yelif move_command == 'D':next_y = cur_y + distances[command_count]if knife_status == 'O':for position in range(cur_y, next_y):self.line_v[cur_x][position] = 1cur_y = next_yelif move_command == 'L':next_x = cur_x - distances[command_count]if knife_status == 'O':for position in range(next_x, cur_x):self.line_h[cur_y][position] = 1cur_x = next_xelif move_command == 'R':next_x = cur_x + distances[command_count]if knife_status == 'O':for position in range(cur_x, next_x):self.line_h[cur_y][position] = 1cur_x = next_xdef get_block_num(self, height, width):for x in range(0, width):for y in range(0, height):if self.line_h[y][x] and self.line_h[y + 1][x] and self.line_v[x][y] and self.line_v[x + 1][y]:self.block_num += 1return self.block_numdef get_unit_block_num(self, height: int, width: int, operations: str, distances: List[int]) -> int:self.init_block(height, width)self.mv_knife(height, width, operations, distances)self.get_block_num(height, width)return self.block_numheight = 3
width = 4
operations = "MRMOMDMLMUMCRMODMC"
distances = [1, 1, 2, 1, 2, 2, 1, 2]ss = Solution()
print(ss.get_unit_block_num(height, width, operations, distances))

相关文章:

【python科目一:生产线系统设计;激光刀切割材料】

工厂有若干条生产线&#xff0c;可以生产不同型号的产品&#xff0c;要求实现功能如下&#xff1a;1. ProductionLineMgmtSys 初始化生产线和产品的生产周期有num条生产线&#xff0c;编号从0开始periods[i]表示生产一个型号为i的产品所需的生产周期&#xff0c;单位为天2. Pro…...

Linux——进程概念(进程状态)

目录 进程状态 三态模型 五态模型 七态模型 Example eg1:阻塞态&#xff1a;等待某种资源的过程 eg2:挂起态 Linux内核源代码 Linux进程状态查看 Linux运行状态 R运行状态&#xff08;running&#xff09;: S睡眠状态&#xff08;sleeping)&#xff1a; D磁盘休眠状…...

超详细:正则表达式从入门到入门

文章目录匹配字符\d \D\s \S量词&#xff1a;匹配多个字符星号*加号问号&#xff1f;大括号{}集合字符[]明确字符范围字符补集字符常见字符集贪婪模式和非贪婪模式匹配开头和结尾贪婪模式和非贪婪模式常用函数re.findall()re.search()re.compile()re.split()re.sub()本文章首发…...

jupyter notebook小技巧

1、.ipynb 文件转word文档 将 jupyter notebook&#xff08;.ipynb 文件&#xff09;转换为 word 文件&#xff08;.docx&#xff09;的最简单方法是使用 pandoc。 首先安装pip install pandoc&#xff0c; 安装后&#xff0c;在将 Jupyter notebook文件目录cmd 然后输入打开…...

考研复试机试 | c++ | 王道复试班

目录n的阶乘 &#xff08;清华上机&#xff09;题目描述代码汉诺塔问题题目&#xff1a;代码&#xff1a;Fibonacci数列 &#xff08;上交复试&#xff09;题目代码&#xff1a;二叉树&#xff1a;题目&#xff1a;代码&#xff1a;n的阶乘 &#xff08;清华上机&#xff09; …...

js闭包简单理解

js里面的闭包是一个难点也是它的一个特色&#xff0c;是我们必须掌握的js高级特性&#xff0c;那么什么是闭包呢&#xff1f;它又有什么作用呢&#xff1f; 1&#xff0c;提到闭包我们这里先讲解一下js作用域的问题 js的作用域分两种&#xff0c;全局和局部&#xff0c;基于我…...

「JVM 编译优化」编译器优化技术

后端编译&#xff08;即时编译、提前编译&#xff09;的目标时将字节码翻译成本地机器码&#xff0c;而难点是输出优化质量较高的机器码&#xff1b; 文章目录1. 优化技术概览2. 方法内联&#xff08;Inlining&#xff09;3. 逃逸分析&#xff08;Escape Analysis&#xff09;4…...

回溯问题(子集型回溯、组合型回溯、排列型回溯)【零神基础精讲】

来源0x3f&#xff1a;https://space.bilibili.com/206214 回溯分为【子集型回溯】【组合型回溯】【排列型回溯】 文章目录回溯基本概念[17. 电话号码的字母组合](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/)子集型回溯&#xff08;分割问题也可以看…...

源代码配置安装Apache

源代码配置安装Apache &#x1f4d2;博客主页&#xff1a; 微笑的段嘉许博客主页 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &#x1f…...

css水平垂直居中各种方法实现方式

不定宽高水平垂直居中&#xff1f; 面试题回答方式&#xff1a; 通过display&#xff1a;flex&#xff1b;justify-content:center; align-items:center;就可以让子元素不定宽高水平垂直居中 也可以父display&#xff1a;flex&#xff1b;&#xff0c;子设置一个margin&#…...

PowerShell Install java 13

java 前言 Java具有大部分编程语言所共有的一些特征&#xff0c;被特意设计用于互联网的分布式环境。Java具有类似于C语言的形式和感觉&#xff0c;但它要比C语言更易于使用&#xff0c;而且在编程时彻底采用了一种以对象为导向的方式。 java download javadownloadPowersh…...

Python的PyQt框架的使用(汇总)

Python的PyQt框架的使用一、前言二、安装PyQt三、使用第三方开发工具四 、创建主窗体五、常用控件篇1.QLineEdit 文本框2.QPushButton按钮控件3.QRadioButton 单选按钮六、布局管理篇1.通过布局管理器布局2.绝对布局七、信号与槽的关联1.编辑信号/槽2.信号/槽编辑器八、资源文件…...

力扣热题100Day05:15.三数之和,17. 电话号码的字母组合,19. 删除链表的倒数第 N 个结点

15.三数之和 题目链接&#xff1a;15. 三数之和 - 力扣&#xff08;Leetcode&#xff09; 思路&#xff1a; &#xff08;1&#xff09;双指针&#xff0c;在外层for循环里加入两个指针&#xff0c;left和right &#xff08;2&#xff09;排序&#xff1a;为了更好地进行去…...

探索开源:获取完整的 GitHub 社区数据集

本篇文章聊聊 GitHub 开放数据集的获取和整理&#xff0c;分享一些数据整理的细节技巧&#xff0c;以及一些相对粗浅的数据背后的事情。 写在前面 分析 GitHub 上的项目和开发者获取是深入、真实的了解开源世界演进的方法之一。 在 GHArchive 项目中&#xff0c;我们能够看到…...

github ssh密钥配置,克隆远程仓库

GitHub的SSH配置 在往github上push项目的时候&#xff0c;如果走https的方式&#xff0c;每次都需要输入账号密码&#xff0c;非常麻烦。而采用ssh的方式&#xff0c;就不再需要输入&#xff0c;只需要在github自己账号下配置一个ssh key即可&#xff01; 很多朋友在用github管…...

突破年薪百万难关!吃透这套Java真题合集

前言我相信大多 Java 开发的程序员或多或少经历过BAT一些大厂的面试&#xff0c;也清楚一线互联网大厂 Java 面试是有一定难度的&#xff0c;小编经历过多次面试&#xff0c;有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#x…...

[黑马程序员SSM框架教程] Spring-11-setter注入

思考&#xff1a;向一个类中传递数据要几种&#xff1f; set方法构造方法 思考&#xff1a;依赖注入描述了在容器中建立bean与bean之间依赖关系的过程&#xff0c;如果bean运行需要数字或字符呢 引用类型简单类型&#xff08;基本数据类型和字符串&#xff09; 注入方式&#x…...

Java多线程(一)--多线程基础知识

1. 为什么要使用并发编程提升多核CPU的利用率&#xff1a;一般来说一台主机上的会有多个CPU核心&#xff0c;我们可以创建多个线程&#xff0c;理论上讲操作系统可以将多个线程分配给不同的CPU去执行&#xff0c;每个CPU执行一个线程&#xff0c;这样就提高了CPU的使用效率&…...

AutoDock, AutoDock-vina等对接工具安装

AutoDock, AutoDock-vina等对接工具安装 AutoDock-GPU安装 下载地址&#xff1a; https://autodock.scripps.edu/downloads/ 将压缩包传送至安装目录中&#xff0c;并解压到当前路径 unzip AutoDock-GPU-develop.zip 找到服务器的cuda的路径&#xff0c;cuda的路径一般默认…...

MySQL常见面试题(2023年最新)

目录1.char和varchar的区别2.数据库的三大范式3.索引是什么4.索引的优点和缺点5.索引怎么设计(优化)6.索引的类型7.索引的数据类型8.索引为什么使用树结构9.二叉查找树、B树、B树10.为什么使用B树不用B树11.最左匹配原则12.MylSAM和InnoDB的区别13.什么是事务14.事务的四大特性…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...