202009-3 点亮数字人生

简介: 202009-3 点亮数字人生

文章目录

  • C++
  • 总结


本题链接202009-3 点亮数字人生

本博客给出本题截图

2.png

C++

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 3010, M = N * 5;
int m, n;
int w[N], f[N];
int h[N], e[M], ne[M], idx;
int q[N], d[N];
vector<int> in[M], out[M];
int get(char* str)
{
    string names[] = {
        "AND", "OR", "NOT", "XOR", "NAND", "NOR"
    };
    for (int i = 0; i < 6; i ++ )
        if (names[i] == str)
            return i;
    return -1;
}
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
    d[b] ++ ;
}
bool topsort()
{
    int hh = 0, tt = -1;
    for (int i = 1; i <= m + n; i ++ )
        if (!d[i])
            q[ ++ tt] = i;
    while (hh <= tt)
    {
        int t = q[hh ++ ];
        for (int i = h[t]; ~i; i = ne[i])
        {
            int j = e[i];
            if ( -- d[j] == 0)
                q[ ++ tt] = j;
        }
    }
    return tt == m + n - 1;
}
int main()
{
    int T;
    scanf("%d", &T);
    while (T -- )
    {
        scanf("%d%d", &m, &n);
        memset(h, -1, sizeof h);
        idx = 0;
        memset(d, 0, sizeof d);
        char str[100];
        for (int i = 1; i <= n; i ++ )
        {
            int cnt;
            scanf("%s%d", str, &cnt);
            f[m + i] = get(str);
            while (cnt -- )
            {
                scanf("%s", str);
                int t = atoi(str + 1);
                if (str[0] == 'I') add(t, m + i);
                else add(m + t, m + i);
            }
        }
        int Q;
        scanf("%d", &Q);
        for (int i = 0; i < Q; i ++ )
        {
            in[i].clear();
            for (int j = 0; j < m; j ++ )
            {
                int x;
                scanf("%d", &x);
                in[i].push_back(x);
            }
        }
        for (int i = 0; i < Q; i ++ )
        {
            out[i].clear();
            int cnt;
            scanf("%d", &cnt);
            while (cnt -- )
            {
                int x;
                scanf("%d", &x);
                out[i].push_back(x);
            }
        }
        if (!topsort()) puts("LOOP");
        else
        {
            for (int i = 0; i < Q; i ++ )
            {
                for (int j = 0; j < m; j ++ ) w[j + 1] = in[i][j];
                for (int j = m + 1; j <= m + n; j ++ )
                    if (f[j] == 0 || f[j] == 5) w[j] = 1;
                    else w[j] = 0;
                for (int j = 0; j < m + n; j ++ )
                {
                    int t = q[j], v = w[t];
                    for (int k = h[t]; ~k; k = ne[k])
                    {
                        int u = e[k];
                        if (f[u] == 0) w[u] &= v;
                        else if (f[u] == 1) w[u] |= v;
                        else if (f[u] == 2) w[u] = !v;
                        else if (f[u] == 3) w[u] ^= v;
                        else if (f[u] == 4) w[u] |= !v;
                        else w[u] &= !v;
                    }
                }
                for (auto x: out[i])
                    printf("%d ", w[m + x]);
                puts("");
            }
        }
    }
    return 0;
}


总结

本题在大模拟的基础上加入了拓扑排序

做了这么多道大模拟的题目,码代码能力确实提升了,就是调试起来会很上头😡

本题需要注意,最后在计算电路结果的时候也是需要考虑顺序的

目录
相关文章
|
人工智能 JavaScript 数据可视化
Cursor、v0 和 Bolt.new:当今 AI 编程工具的全面解析与对比
本文深入解析了 Cursor AI、v0 和 Bolt.new 三大 AI 编程工具的特点与应用场景。Cursor 适合日常编码与团队协作,v0 专注于 UI 原型设计,Bolt.new 擅长全栈原型开发。各工具在功能上互为补充,开发者可根据需求灵活选择,以提升工作效率。
4938 1
|
算法 计算机视觉
【MATLAB】CEEMD+FFT+HHT组合算法
【MATLAB】CEEMD+FFT+HHT组合算法
222 0
【MATLAB】CEEMD+FFT+HHT组合算法
|
机器学习/深度学习 自然语言处理 算法
一个中心+三大原则 -- 阿里巴巴小蜜这样做智能对话开发平台
        在阿里巴巴智能服务事业部的X蜂会上,小蜜北京团队的高级算法专家李永彬(水德)分享了小蜜智能对话开发平台的构建,围绕平台来源、设计理念、核心技术、业务落地情况四大维度讲述了一个较为完整的智能任务型对话开发平台的全景。
5346 1
|
算法 安全 物联网
ECC算法详解+python实现
在了解了RSA算法的基础上,我们再学习ECC算法。
1005 1
ECC算法详解+python实现
|
存储 机器学习/深度学习 Cloud Native
阿里云产品免费试用活动可试用云产品配置、时长、规则及常见问题汇总
云产品免费试用活动是阿里云一直在做的一个活动,只是不同时间可申请试用的云产品配置和试用时长不一样,目前最新可申请试用的云服务器配置最低的是1核2G配置,配置最高的是4核16G,最长试用时长是3个月,下面是阿里云产品免费试用活动可申请试用的产品配置、时长及规则汇总。
阿里云产品免费试用活动可试用云产品配置、时长、规则及常见问题汇总
|
数据采集 机器学习/深度学习 弹性计算
阿里云服务器的十大用途
阿里云服务器的十大用途,使用阿里云服务器可以做什么?阿里云百科分享使用阿里云服务器常用的十大使用场景,说是十大场景实际上用途有很多,阿里云百科分享常见的云服务器使用场景,如本地搭建ChatGPT、个人网站或博客、运维测试、学习Linux、跑Python、小程序服务器等等,云服务器吧分享使用阿里云服务器可以做的几件小事
573 0
|
弹性计算
阿里云服务器配置不够可以升级CPU内存带宽磁盘均可升级配置
阿里云服务器支持按需升降配,购买阿里云ECS云服务器不用担心服务器配置高低的问题,如果后续使用过程中云服务器配置不够或者过高,可以使用控制台升降配功能来调整云服务器配置:
阿里云短信使用入门/开发接口文档一篇文章全搞定
阿里云短信提供秒级触达到达率99%,国际/港澳台短信覆盖200多个国家和地区,阿里云短信接入简单
6926 0
|
供应链 安全 Serverless
蚂蚁开放联盟链是个啥?与蚂蚁其他区块链产品的差异
蚂蚁开放联盟链类似于公链,多家生态共享一条链,里面有节点和一般成员,基于区块链的共识节点技术来实现提效,通过加密、合约控制、c3s(暂未上线)来保持强私密性,费用相对低,且通过CloudIDE/SDK等工具实现开发工具的极大优化,一般是100元-999元,企业版一年是4888。
5006 0