CCF 202009-3 点亮数字人生(拓扑排序)
题目背景
土豪大学的计算机系开了一门数字逻辑电路课,第一个实验叫做“点亮数字人生”,要用最基础的逻辑元件组装出实际可用的电路。时间已经是深夜了,尽管实验箱上密密麻麻的连线已经拆装了好几遍,小君同学却依旧没能让她的电路正常工作。你能帮助她模拟出电路的功能,成功点亮她的数字人生吗?
问题描述
本题中,你需要实现一个简单的数字逻辑电路模拟器。如果你已经有了此方面的基础,可以直接跳过本节。在阅读时,也可以参照前两个样例的图示和解释,这有助于你更好地理解数字逻辑电路的工作原理。
数字逻辑电路是用来传输数字信号(也就是二进制信号)的电路。一般来说,数字逻辑电路可以分为两大类,即组合逻辑(combinational logic)电路和时序逻辑(sequential logic)电路。在本题中,我们仅关注组合逻辑电路。这种电路仅由逻辑门(logical gate)构成。一个逻辑门可以理解为一个多输入单输出的函数,输入端连接至少一个信号,而后经过一定的逻辑运算输出一个信号。常见的逻辑门包括与(AND)、或(OR)、非(NOT)、异或(XOR)等,均与编程语言中的按位运算是对应的。
将一系列的逻辑门连接起来,就能构成具有特定功能的电路。它的功能可能很简单(如一位二进制加法只需要一个异或门),也可能极其复杂(如除法)。无论复杂程度,这类电路的特点是:它不维持任何的状态,任何时刻输出只与输入有关,随输入变化。真实世界中的逻辑器件由于物理规律的限制,存在信号传播延时。为了简单起见,本题中我们模拟的组合逻辑电路不考虑延时:一旦输入变化,输出立刻跟着变化。
考虑到组合逻辑电路的这一特性,设计时不能允许组合环路(combinational loop)的存在,即某逻辑门的输入经过了一系列器件之后又被连接到了自己的输入端。真实世界中,这种做法将导致电路变得不稳定,甚至损坏元器件。因此,你也需要探测可能的环路。需要注意,环路的存在性与逻辑门的具体功能没有任何关系;只要连接关系上存在环路,电路就无法正常工作。
输入格式
输入数据包括若干个独立的问题,第一行一个整数
,满足
。接下来依次是这
个问题的输入,你需要对每个问题进行处理,并且按照顺序输出对应的答案。
每一个问题的输入在逻辑上可分为两部分。第一部分定义了整个电路的结构,第二部分定义了输入和输出的要求。实际上两部分之间没有分隔,顺序读入即可。
第一部分
第一行是两个空格分隔的整数
,分别表示了整个电路的输入和器件的数量,满足
并且
。其中
和
都是与测试点编号有关的参数。
接下来
行,每行描述一个器件,编号从 1 开始递增,格式如下:
FUNC k L_1 L_2 … L_k
None
其中 FUNC 代表具体的逻辑功能,
表示输入的数量,后面跟着该器件的
个输入端描述
,格式是以下二者之一:
Im:表示第 m 个输入信号连接到此输入端,保证
;
On:表示第 n 个器件的输出连接到此输入端,保证
。
所有可能的 FUNC 和允许的输入端数量如下表所述:
FUNC 最少输入数量 最多输入数量 功能描述
NOT 1 1 非
AND 2
与
OR 2
或
XOR 2
异或
NAND 2
与非(先全部与后取非)
NOR 2
或非(先全部或后取非)
所有的器件均只有一个输出,但这个输出信号可以被用作多个器件的输入。
第二部分
第一行是一个整数
,表示此电路需要运行
次。每次运行,都会给定一组输入,并检查部分器件的输出是否正确。
满足
,其中
是一个与测试点编号有关的参数。
接下来的
行为输入描述,每一行的格式如下:
I_1 I_2 … I_M
None
每行有
个可能为 0 或 1 的数字,表示各个输入信号(按编号排列)的状态。
接下来的
行为输出描述,每一行的格式如下:
s_i O_1 O_2 … O_s
None
第一个整数
表示需要输出的信号数量。后面共有
个在
到
之间的数字,表示在对应的输入下,组合逻辑完成计算后,需要输出结果的器件编号。
注意 O 序列不一定是递增的,即要求输出的器件可能以任意顺序出现。
输出格式
对于输入中的
个问题,你需要按照输入顺序输出每一个问题的答案:
如果你检测到电路中存在组合环路,则请输出一行,内容是 LOOP,无需输出其他任何内容。
如果电路可以正常工作,则请输出
行,每一行包含
个用空格分隔的数字(可能为 0 或 1),依次表示“输出描述”中要求的各个器件的运算结果。
样例输入1
1
3 5
XOR 2 I1 I2
XOR 2 O1 I3
AND 2 O1 I3
AND 2 I1 I2
OR 2 O3 O4
4
0 1 1
1 0 1
1 1 1
0 0 0
2 5 2
2 5 2
2 5 2
2 5 2
Data
样例输出1
1 0
1 0
1 1
0 0
Data
样例1说明
本样例只有一个问题,它定义的组合逻辑电路结构如下图所示。其功能是一位全加器,即将三个信号相加,得到一个两位二进制数。要求的器件 2 的输出是向更高位的进位信号,器件 5 的输出是本位的求和信号。
p3.jpg
对于第一组输入 0 1 1,输出是 1 0;对于第二组输入 1 0 1,输出恰好依旧是 1 0(但电路内部状态不同)。
样例输入2
1
2 6
NOR 2 O4 I2
AND 2 O4 O6
XOR 2 O5 O1
NOT 1 O6
NAND 2 O2 O2
AND 2 I1 O3
2
0 0
1 0
3 2 3 4
6 1 2 3 4 5 6
Data
样例输出2
LOOP
Data
样例2说明
本样例也只有一个问题,它定义的组合逻辑电路结构如下图所示。
p4.jpg
这是一个带组合环路的电路,因此无法正常工作。特别地,其中最短的环路有以下三条:
6 - 2 - 5 - 3 - 6
4 - 1 - 3 - 6 - 4
2 - 5 - 3 - 6 - 2
评测用例规模与约定
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.StreamTokenizer;
import java.util.*;public class DigitalMock {static StreamTokenizer st=new StreamTokenizer(new BufferedInputStream(System.in));static int nextInt() throws IOException{st.nextToken();return (int)st.nval;}static String next() throws IOException{st.nextToken();return st.sval;}static int Q;//问题个数static int m;//信号输入个数static int n;//器件个数static Nop nops[]=new Nop[550];static int head[]=new int[550];static int ne[]=new int[50000];static int to[]=new int[50000];static int cnt=1;static int du[]=new int[550];static void init(){//初始化Arrays.fill(head,0);Arrays.fill(nops,null);Arrays.fill(ne,0);Arrays.fill(to,0);Arrays.fill(du,0);cnt=1;}static void add(int u,int v){to[cnt]=v;ne[cnt]=head[u];head[u]=cnt++;}public static void main(String[] args) throws IOException{Q=nextInt();for (int i = 0; i < Q; i++) {init();m=nextInt();n=nextInt();for (int i1 = 1; i1 <=n; i1++) {String type=next();int inputsNum=nextInt();for (int j = 0; j < inputsNum; j++) {String in=next();char t=in.charAt(0);int u=Integer.valueOf(in.substring(1));du[i1]++;//起始输入点if(t=='I'){add(u+n,i1);}//其他器件else{add(u,i1);}}Nop nop = new Nop(type);nops[i1]=nop;}for (int k = 1; k <=m; k++) {nops[k+n]=new Nop("SUPER");}int s=nextInt();List<List<Integer>> inputs = new ArrayList<>();List<List<Integer>> ques = new ArrayList<>();for (int i1 = 0; i1 < s; i1++) {List<Integer> sign = new ArrayList<>();for (int i2 = 0; i2 < m; i2++) {sign.add(nextInt());}inputs.add(sign);}for (int p = 0; p < s; p++) {int num=nextInt();List<Integer> q = new ArrayList<>();for (int i1 = 0; i1 < num; i1++) {q.add(nextInt());}ques.add(q);}if(isLoop()==false){System.out.println("LOOP");continue;}for (int i1 = 0; i1 < s; i1++) {query(inputs.get(i1),ques.get(i1));}}}static void query(List<Integer> input,List<Integer> ques){for (int i = 1; i <=n; i++) {//清空所有信号nops[i].input=new ArrayList<>();}for (int i = 1; i <= input.size(); i++) {nops[i+n].output=input.get(i-1);}topo();ArrayList<Integer> res = new ArrayList<>();for (Integer que : ques) {res.add(nops[que].getOut());}for (int i = 0; i < res.size(); i++) {System.out.printf(res.get(i)+" ");}System.out.println();}static boolean isLoop(){int visnum=0;int rudu[];rudu=du.clone();Queue<Integer> q=new LinkedList<>();for (int i = 1; i <=m+n; i++) {if(rudu[i]==0)q.offer(i);}while (!q.isEmpty()){Integer x = q.poll();//出队visnum++;//访问点+1for(int i=head[x];i!=0;i=ne[i]){int y=to[i];rudu[y]--;if(rudu[y]==0){q.offer(y);}}}return visnum==m+n;}static void topo(){int rudu[];rudu=du.clone();Queue<Integer> q=new LinkedList<>();for (int i = 1; i <=m+n; i++) {if(rudu[i]==0)q.offer(i);}while (!q.isEmpty()){Integer x = q.poll();//出队for(int i=head[x];i!=0;i=ne[i]){int y=to[i];rudu[y]--;nops[y].input.add(nops[x].getOut());if(rudu[y]==0){q.offer(y);}}}}
}
class Nop{//NOT/AND/OR/XOR/NAND/NOR/SUPER(指输入信号节点,超级节点)String type;List<Integer> input;//输入端int output=-1;//输出端public Nop(String type) {this.type = type;this.input=new ArrayList<>();}public int getOut(){//计算输出端结果if(output!=-1) return output;if(type.equals("NOT")){return input.get(0)==0?1:0;}else if(type.equals("SUPER")){return output;}else if(type.equals("AND")){for (Integer integer : input) {if(integer==0) return 0;}return 1;}else if(type.equals("OR")){for (Integer integer : input) {if(integer==1) return 1;}return 0;}else if(type.equals("XOR")){int res=0;for (Integer integer : input) {res^=integer;}return res;}else if(type.equals("NAND")){for (Integer integer : input) {if(integer==0) return 1;}return 0;}else{for (Integer integer : input) {if(integer==1) return 0;}return 1;}}
}
相关文章:
CCF 202009-3 点亮数字人生(拓扑排序)
题目背景 土豪大学的计算机系开了一门数字逻辑电路课,第一个实验叫做“点亮数字人生”,要用最基础的逻辑元件组装出实际可用的电路。时间已经是深夜了,尽管实验箱上密密麻麻的连线已经拆装了好几遍,小君同学却依旧没能让她的电路正…...

Docker笔记-进入运行中的镜像,查看日志等操作
docker搭建好后,查看运行的docker镜像: docker ps -a 进入运行的容器,命令如下: docker exec -it <容器ID> /bin/bash # 或者,直接用容器里面的命令,比如mysql镜像 docker exec -it <容器ID>…...
大语言模型(LLM) RAG概念
RAG(Retrieval-Augmented Generation)是一种用于自然语言处理的模型架构,特别是针对生成式任务。RAG模型结合了检索和生成两种方法,以提高生成式任务的性能。它将信息检索(Retrieval)和文本生成(…...
PHP使用AES进行加解密
前言 对接一个第三方平台,其使用AES对称加密 代码 //方式1 //加密 function enAES($originTxt, $keyQ6Mr6rDpn12iZb){return base64_encode(openssl_encrypt($originTxt, AES-128-ECB,$key, OPENSSL_RAW_DATA)); }//解密 function deAES($originTxt, $keyQ6Mr6rD…...

20240313寻找集成联调交付的具体方式
集成联调交付(Integrated Joint Debugging and Delivery)是软件开发过程中的一个阶段,主要涉及将不同的软件模块或组件整合在一起,并进行联合调试和测试,以确保它们能够作为一个整体正常工作。这个过程通常发生在开发周…...
makefile 学习
patsubst 函数 原型$(patsubst 原模式, 目标模式, 文件列表) 如果文件列表中没有匹配的字符串,就会把整个文件列表的值赋值给变量 // 如果当前目录下有 main.cpp test.cpp SRC $(wildcard *.cpp *.c) # 在工作目录下寻找所有c cpp 文件 …...

释放人工智能的力量:GPU服务器托管和高电机柜托管的关键作用
随着人工智能技术的不断发展,GPU服务器托管和高电机柜托管也变得愈发重要。这些技术在人工智能领域发挥着关键作用,为AI算法的训练和推理提供了强大的计算支持。 GPU服务器托管是指将GPU服务器放置在专门的数据中心中,通过云服务提供商提供的…...
70后姐妹上海创业,要IPO了
一种能与消费者高效互动的自动贩卖机,不仅于近日将一家上海公司送到港交所的门前,还让一对70后姐妹的身价超过13亿元。 在殷珏辉和妹妹殷珏莲的带领下,中国营销服务提供商趣致集团坐拥7543台自动贩卖机和超过5000万注册用户。通过为品牌方提…...
React Hooks、useState、useEffect 、react函数状态
Hooks Hooks 概念理解 学习目标: 理解 Hooks 的概念及解决的问题 什么是 hooks hooks 的本质: 一套能够使函数组件更强大、更灵活的(钩子) React 体系里组件分为类组件和函数组件 多年使用发现,函数组件是一个更加匹…...
wsl-oraclelinux 固定ip
wsl-oraclelinux 固定ip 0. 引言1. Windows 创建启动脚本2. 配置 wsl Oracle Linux 0. 引言 工作需要,安装了一个 wsl Oracle Linux 8.9,也想给它一个固定的 ip。 1. Windows 创建启动脚本 删除 PSScheduledJob, notepad $PSHOME\powersh…...

性能测试工具——wrk的安装与使用
前言 想和大家来聊聊性能测试,聊到了性能测试必须要说的是性能测试中的工具,在这些工具中我今天主要给大家介绍wrk。 介绍 wrk是一款开源的性能测试工具 ,简单易用,没有Load Runner那么复杂,他和 apache benchmar…...

使用tui-image-editor 图片编辑 标注图片
需求背景: 鼠标悬浮在图片上 出现编辑按钮 点击编辑 对该图片进行编辑(输入文案、涂鸦、标记、裁剪等) 可以体验一下它线上编辑器 Image-editor | TOAST UI :: Make Your Web Delicious! 使用 首先在你的前端项目中安装: np…...
C++面试题和笔试题(五)
一、 #include <iostream> using namespace std; class Base { public: Base(int j) : i(j) {} virtual ~Base() {} void func1() { i * 10; func2(); } int getvalue() { return i; } protected: virtual void func2() { i; } protected: int i;…...

Mysql:行锁,间隙锁,next-key锁?
注:以下讨论基于InnoDB引擎。 文章目录 问题引入猜想1:只加了一行写锁,锁住要修改的这一行。语义问题数据一致性问题 猜想2:要修改的这一行加写锁,扫描过程中遇到其它行加读锁猜想3:要修改的这一行加写锁&…...

Grass推出Layer 2 Data Rollup
Grass推出Layer 2 Data Rollup Grass邀请链接最新资讯 Grass邀请链接 欢迎使用我的邀请码进行注册: 邀请链接 如果你还不知道注册流程:详见Grass: 出售闲置带宽实现被动收入 最新资讯 简讯:2024年3月13日,Grass宣布正在建立基于Solana的La…...
[Java、Android面试]_04_进程、线程、协程
本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可收藏 文…...
MyLisp项目日志:解析用户输入与波兰表达式
文章目录 编程语言模拟自然语言定义名词和形容词定义短语定义句子 简化模拟过程正则表达式 波兰表达式及其解析波兰表达式语法描述波兰表达式语法解析解析用户输入 v0.0.2 编程语言 编程语言是类似于自然语言的,虽然我们是自然而然就学会了自己的母语,但…...

torch.backends.cudnn.benchmark 作用
相关参数 torch.backends.cudnn.enabled torch.backends.cudnn.benchmark torch.backends.cudnn.deterministictorch.backends.cudnn.benchmark True:将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,…...
vue的$nextTick应用场景
文章目录 $nextTick有什么作用?一、NextTick是什么二、为什么要有nextTick? $nextTick有什么作用? 一、NextTick是什么 官方对其的定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的…...
springboot RestTemplate 发送xml、接收xml、pojo中的属性转为属性
背景 调用第三方接口时,它们的系统比较老,只支持接收xml而不支持json,默认的springboot RestTemplate不支持发送xml,添加依赖就可以解决这个问题。 添加jackson-dataformat-xml依赖 FasterXML/jackson-dataformat-xml是一个xml…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...