[PAT 甲级] 1179 Chemical Equation (DFS)

news2025/1/16 18:45:03


英文题目

题目翻译(GPT):

1179 化学方程式

化学方程式是一种用符号和公式表示化学反应的方法,其中反应物在方程式的左侧,生成物在右侧。例如:
CH₄ + 2O₂ -> CO₂ + 2H₂O
表示反应物为甲烷和氧气(CH₄O₂),生成物为二氧化碳和水(CO₂H₂O)。

现在给定一组反应物和生成物,你需要判断通过何种方式可以得到这些生成物,要求每种反应物只能使用一次。为简化起见,我们假设方程式右侧的所有物质都作为单一生成物。

输入说明

输入文件包含一个测试用例。对于每个测试用例:

  • 第一行给出一个整数 N2 ≤ N ≤ 20),表示 N 个反应物的索引,它们是 2 位数字的不同索引。
  • 第二行给出一个整数 M1 ≤ M ≤ 10),表示 M 个生成物的索引,它们也是 2 位数字的不同索引。
  • 接下来是一正整数 KK ≤ 50),表示接下来的 K 行反应方程。

每行以如下格式表示反应方程:

reactant_1 + reactant_2 + ... + reactant_n -> product

其中,所有反应物是不同的,并且按照索引递增排序。

注意
  • 确保同一组反应物不会生成两个或更多不同的生成物。例如:
    01 + 02 -> 0301 + 02 -> 04 是不可能的。
  • 如果某个反应物未参与反应,则不能仅以它自身生成生成物。例如:
    01 -> 01 是不允许的,无论该方程是否在输入中。
  • 每种生成物在反应方程列表中不会有超过 5 种不同的生成方式。

输出说明

对于每个测试用例,输出使用给定反应物得到所有指定生成物的方程式。注意,每种反应物只能被使用一次。

  • 每个方程占一行,格式与输入中的方程一致,且生成物的顺序与输入中的顺序相同。
  • 对于每个生成物,如果存在多个解决方案,输出字典序最小的方案(按照反应物序列递增的顺序比较)。
    • 例如,反应物序列 {a₁, …, aₘ} 被认为比序列 {b₁, …, bₙ} 小,当且仅当存在一个最小下标 j,使得 aⱼ < bⱼ,且前 j-1 项相等。

保证至少存在一个解决方案。

思路:

看到N和M的范围就注定了这题是暴搜加回溯,至于字典序,直接对于方程式的字符串排序就行,要能熟练运用 map 以及 string 的话,这题就很简单了。

代码

#include<bits/stdc++.h>

using namespace std;

const int N = 110;

#define int long long

int n, m, k;

bool ans = 0;

string a[N];
map<string, int> reac, pro;
map<string, vector<string>> equ;
map<string, string> ways;

void dfs(int u) 
{
    if(u == m + 1) {
        for (int i = 1; i <= m; i++) {
            string p = a[i];
            string e = ways[p];
            cout << e.substr(0, 2);
            for (int j = 2; j < e.size(); j+=2) {
                cout << " + " << e.substr(j,2);
            }
            cout << " -> " << p << endl;
        }
        ans = 1;
        return ;
    }
    
    string p = a[u];
    for (string e : equ[p]) {
        int f = 1;
        for (int i = 0; i < e.size(); i+=2) {
            string r = e.substr(i, 2);
            if(reac[r] == 0) {
                f = 0;
                break;
            }
        }
        if(!f) continue;
        for (int i = 0; i < e.size(); i+=2) {
            string r = e.substr(i, 2);
            reac[r] = 0;
        }
        ways[p] = e;
        dfs(u + 1);
        if(ans) return;
        for (int i = 0; i < e.size(); i+=2) {
            string r = e.substr(i, 2);
            reac[r] = 1;
        }
        ways[p] = "";
    }
}

void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        reac[s] = 1;
    }
    cin >> m;
    for (int i = 1; i <= m; i++) {
        cin >> a[i];
        string p = a[i];
        if (reac[p] == 1 && equ[p].size() == 0) {
            equ[p].push_back(p);
        }
    }
    cin >> k;
    getchar();
    while(k --) {
        string s;
        getline(cin, s);
        string p = s.substr(s.size() - 2), h;
        for (int i = 0; i < s.size() - 6; i += 5) {
            h += s.substr(i, 2);
        }
        equ[p].push_back(h);
    }
    for (auto& it : equ) {
        sort(it.second.begin(), it.second.end());
    }
    
    dfs(1);
    
    return ;
}

signed main()
{
    int T = 1;
    while(T--) solve();
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android分区和root

线刷包内容&#xff1a; 线刷包是一个完整的android镜像&#xff0c;不但包括android、linux和用户数据&#xff0c;还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区&#xff0c;包括linux下主要的二进制程序。 boot.img…

每日一题(五):n个正整数排列,求组合后最大数

目录 一、题目 二、题目分析 &#xff08;一&#xff09;明确需求 背景知识&#xff1a;字符串的比较与连接 1.字符串的比较 2.字符串的连接 (二)分析思路 三、将思路转换为程序 四、总结 一、题目 给定n个正整数a1,a2,……,an对这n个数进行排列&#xff0c;求组合后可以得到…

【STM32-学习笔记-3-】TIM定时器

文章目录 TIM定时器Ⅰ、TIM定时器函数Ⅱ、TIM_TimeBaseInitTypeDef结构体参数①、TIM_ClockDivision②、TIM_CounterMode③、TIM_Period④、TIM_Prescaler⑤、TIM_RepetitionCounter Ⅱ、定时器配置Ⅲ、定时器外部中断NVIC配置 TIM定时器 Ⅰ、TIM定时器函数 // 将定时器寄存器…

【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读…

新垂直电商的社交传播策略与AI智能名片2+1链动模式S2B2C商城小程序的应用探索

摘要&#xff1a;随着互联网技术的不断进步和电商行业的快速发展&#xff0c;传统电商模式已难以满足消费者日益增长的个性化和多元化需求。新垂直电商在此背景下应运而生&#xff0c;通过精准定位、用户细分以及深度社交传播策略&#xff0c;实现了用户群体的快速裂变与高效营…

【ORACLE战报】2025.1月OCP | MySQL考试

2025.1月【最新考试成绩出炉】 OCP战报 MySQL 战报 部分学员成绩及证书

九 RK3568 android11 MPU6500

一 MPU6500 内核驱动 1.1 查询设备连接地址 查看原理图, MPU6500 I2C 连接在 I2C4 上, 且中断没有使用 i2c 探测设备地址为 0x68 1.2 驱动源码 drivers/input/sensors/gyro/mpu6500_gyro.c drivers/input/sensors/accel/mpu6500_acc.c 默认 .config 配置编译了 mpu6550 …

Android JecPack组件之LifeCycles 使用详解

一、背景 LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息&#xff0c;当宿主生命周期发生变化时&#xff0c;会通知监听宿主的观察者。 LifeCycle 的出现主要是为了…

机器学习(2):线性回归Python实现

1 概念回顾 1.1 模型假设 线性回归模型假设因变量y yy与自变量x xx之间的关系可以用以下线性方程表示&#xff1a; y β 0 β 1 ⋅ X 1 β 2 ⋅ X 2 … β n ⋅ X n ε y 是因变量 (待预测值)&#xff1b;X1, X2, ... Xn 是自变量&#xff08;特征&#xff09;β0, β1,…

2025.1.15——二、字符型注入

一、基本操作&#xff1a;整理已知信息&#xff0c;本题为字符型注入 二、解题步骤 step 1&#xff1a;确认为字符型注入 键入&#xff1a; 1 键入&#xff1a;1 and 12 # 发现报错 键入&#xff1a;1 and 11 # 未发现报错 所以确认为字符型注入 step 2&#xff1a;查询…

4、dockerfile实现lnmp和elk

dockerfile实现lnmp 使用dockerfile n&#xff1a;nginx&#xff0c;172.111.0.10 m&#xff1a;mysql&#xff0c;172.111.0.20 p&#xff1a;php&#xff0c;172.111.0.30 安装配置nginx 1、准备好nginx和wordpress安装包 2、配置dockerfile 3、配置nginx主配置文件ngin…

金融项目实战 05|Python实现接口自动化——登录接口

目录 一、代码实现自动化理论及流程 二、脚本实现的理论和准备工作 1、抽取功能转为自动化用例 2、搭建环境(测试工具) 3、搭建目录结构 三、登录接口脚本实现 1、代码编写 1️⃣api目录 2️⃣script目录 2、断言 3、参数化 1️⃣编写数据存储文件&#xff1a;jso…

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置&#xff1a; 代码通过 FlinkKafkaProducer 创建 Kafka 生产者&#xff0c;用于向 Kafka 主题发送消息。Flink 执行环境的配置&#xff1a; 配置了 Flink 的检查点机制&#xff0c;确保消息的可靠性&#xff0c;支…

基于国产麒麟操作系统,通过Kubeadm离线部署Kubernetes 1.28版本

文章目录 前言一、环境准备1.主机操作系统说明2.主机硬件配置3.ansible-playbook相关目录准备4.下载离线部署包4.1. 下载kubeclt、kubeam、kubelet RPM包4.2. 下载docker安装包4.3. 下载containerd安装包4.4. 镜像包下载 二、部署流程三、部署过程1.修改hosts文件2.部署单maste…

3、docker的数据卷和dockerfile

dockerfile--------------------自定义镜像 docker的数据卷&#xff1a; 容器与宿主机之间&#xff0c;或者容器和容器之间的数据共享&#xff08;目录&#xff09;。 创建容器的时间&#xff0c;通过指定目录&#xff0c;实现容器于宿主机之间&#xff0c;或者容器和容器之…

登上Nature!交叉注意力机制 发顶会流量密码!

在深度学习领域&#xff0c;交叉注意力融合技术正迅速崛起&#xff0c;并成为处理多模态数据的关键工具。这一技术通过有效地整合来自不同模态的信息&#xff0c;使得模型能够更好地理解和推理复杂的数据关系。 随着多模态数据的日益普及&#xff0c;如图像、文本和声音等&…

网安——CSS

一、CSS基础概念 CSS有两个重要的概念&#xff0c;分为样式和布局 CSS的样式分为两种&#xff0c;一种是文字的样式&#xff0c;一种是盒模型的样式 CSS的另一个重要的特质就是辅助页面布局&#xff0c;完成HTML不能完成的功能&#xff0c;比如并排显示或精确定位显示 从HT…

SOME/IP协议详解 基础解读 涵盖SOME/IP协议解析 SOME/IP通讯机制 协议特点 错误处理机制

车载以太网协议栈总共可划分为五层&#xff0c;分别为物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;应用层&#xff0c;其中今天所要介绍的内容SOME/IP就是一种应用层协议。 SOME/IP协议内容按照AUTOSAR中的描述&#xff0c;我们可以更进一步…

Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢日志开启和分析等)

一、查询优化 1、查询优化器 (Query Optimizer) MySQL查询优化器&#xff08;Query Optimizer&#xff09;是MySQL数据库管理系统中的一个关键组件&#xff0c;负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗&#xff…

CV项目详解:基于yolo8的车辆识别系统(含源码和具体教程)

使用YOLOv8&#xff08;You Only Look Once&#xff09;和OpenCV实现车道线和车辆检测&#xff0c;目标是创建一个可以检测道路上的车道并识别车辆的系统&#xff0c;并估计它们与摄像头的距离。该项目结合了计算机视觉技术和深度学习物体检测。 使用YOLOv8和OpenCV实现车道线…