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

化学方程式配平 第33次CCF-CSP计算机软件能力认证

很经典的大模拟题目 但是还不算难 大模拟题最需要注意的就是细节

写代码一定要考虑全面 并且要细心多debug 多打断点+STL库的熟练使用

istringstream真的处理字符串非常好用

注意解耦合思想 这样改代码debug更加清晰

https://www.acwing.com/problem/content/5724/

#include<bits/stdc++.h>
using namespace std;
#define THRESHOLD 1e-5  // 设置阈值为 1e-5
//给定方程式 思考是否可以配平0
//使用矩阵 元素个数*化合物个数
int n;
//得到化学反应方程式
vector<vector<int>> get_matrix(istringstream& iss) {
    map<int, map<string,int>> elements;//elements[数字][元素]=第几个化合物的元素的个数
    set<string> ee;//元素个数
    int m;//化合物个数
    iss >> m;//化合物个数
    
    for (int i = 0; i < m; i++) {
        string material;//每一个化合物
        iss >> material;
        string ss;//暂存元素
        for (int j = 0; j < material.size(); j++) {
            if (material[j] >= 'a' && material[j] <= 'z') {
                ss += material[j];
            }
            else {
                //是数字
                int num = material[j] - '0';
                while ((j + 1) < material.size() && material[j + 1] >= '0' && material[j + 1] <= '9') {
                    num = num * 10 + (material[j + 1] - '0');
                    j++;
                }
                elements[i][ss] += num;
                ee.insert(ss);
                ss = "";
            }
        }
    }
    //给元素排序
    vector<string> eee = vector<string>(ee.begin(), ee.end());
    //元素个数*化合物个数
    vector<vector<int>> matrix(eee.size(), vector<int>(m, 0));
    for (int i = 0; i < ee.size(); i++) {
        for (int j = 0; j < m; j++) {
            matrix[i][j] = elements[j][eee[i]];
        }
    }
    return matrix;
}

vector<vector<double>> get_gauss_matrix(vector<vector<int>> matrix) {
    vector<vector<double>> double_matrix;
    for (const auto& row : matrix) {
        vector<double> new_row;
        for (int val : row) {
            new_row.push_back(static_cast<double>(val));
        }
        double_matrix.push_back(new_row);
    }
    int i = 0, j = 0;//(i,j)代表 当前矩阵左上角起始位置
    while (i < double_matrix.size() && j < double_matrix[0].size()) {
        int flag = 1;
        for (int k = i; k < double_matrix.size(); k++) {
            if (double_matrix[k][j] != 0) {
                flag = 0;
                break;
            }
        }
        //对子矩阵进行重复
        if (flag == 1) { j++; continue; }
        //否则
        else {
       
            if (double_matrix[i][j] == 0) {
                
                for (int k = i + 1; k < double_matrix.size(); k++) {
                    if (double_matrix[k][j] != 0) {
                        swap(double_matrix[i], double_matrix[k]);
                        break;
                    }
                }
                //pprint(double_matrix); cout << endl;
            }
            
            //遍历剩下所有行
            for (int k = i + 1; k < double_matrix.size(); k++) {
                double mul = double_matrix[k][j] / double_matrix[i][j];
                for (int z = j; z < double_matrix[0].size(); z++) {
                    double_matrix[k][z] -= mul * double_matrix[i][z];
                }

            }

        }
        i++; j++;
        // 遍历矩阵并将小于阈值的元素设为0
        for (int i = 0; i < double_matrix.size(); ++i) {
            for (int j = 0; j < double_matrix[0].size(); ++j) {
                if (abs(double_matrix[i][j]) < THRESHOLD) {
                    double_matrix[i][j] = 0;
                }
            }
        }
    }
    return double_matrix;
}
string judge(vector<vector<double>> gauss_matrix) {
    int num = gauss_matrix[0].size();//变量个数;
    int rank = 0;
    int flag = 1;
    for (int i = 0; i < gauss_matrix.size(); i++) {
        for (int j = 0; j < gauss_matrix[i].size(); j++) {
            //如果有非0的flag变成0
            if (gauss_matrix[i][j] != 0) {
                flag = 0;
                break;
            }        
        }
        if (flag == 1) {
            break;
        }else {
            rank++;
            flag = 1;
        }
    }
    if (rank < num) return "Y";
    return "N";
}
string solve(istringstream &iss) {
    vector<vector<int>> matrix=get_matrix(iss);//化学反应方程式
    vector<vector<double>> gauss_matrix = get_gauss_matrix(matrix);//获得高斯消元的行阶梯形式
    return judge(gauss_matrix);
}

int main() {
    cin >> n;
    cin.ignore();  // 忽略换行符
    while (n--) {
        string s;
        getline(cin, s);
        istringstream iss(s);
        cout << solve(iss)<<endl;
    }
    
    return 0;
}

http://www.dtcms.com/a/104912.html

相关文章:

  • WEB安全--文件上传漏洞--黑名单绕过
  • 《Linux运维总结:基于银河麒麟V10操作系统+ARM64架构CPU二进制部署单机ACL版consul v1.18.1》
  • 【linux】管理磁盘——RAID10(含备份)与逻辑卷管理
  • Java线程池详解
  • 用deepseek创建可运行的简单的php框架
  • 如何在k8s中对接s3存储
  • 多线程 - wait notify
  • Apache Commons Lang3 常用方法详解
  • 大数据(4.3)Hive基础查询完全指南:从SELECT到复杂查询的10大核心技巧
  • 【超分辨率】基于DDIM+SwinUnet实现超分辨率
  • 深入理解pthread多线程编程:从基础到生产者-消费者模型
  • Android: Handler 的用法详解
  • 【工具】在 Visual Studio 中使用 Dotfuscator 对“C# 类库(DLL)或应用程序(EXE)”进行混淆
  • 关于 Nginx 配置中 proxy_set_header Host $host 的作用及其对 HTTP 请求头影响的详细说明,结合示例展示设置前后的差异
  • 【VSCode SSH 连接远程服务器】:身份验证时,出现 key: invalid format 的问题
  • 服务端向客户端推送数据的实现方案
  • Linux | I.MX6ULL 终结者底板原理图讲解完(第六天)
  • 关于亚马逊TTS的笔记
  • 银行回单识别技术应用与API服务解析
  • 1 分钟掌握 PlantUML,快速绘制 UML 类图!
  • Docker学习--本地镜像管理相关命令--docker history 命令
  • 在Windows下使用Docker部署Nacos注册中心(基于MySQL容器)
  • 初识C++(入门)
  • kubernetes》》k8s》》Deployment》》ClusterIP、LoadBalancer、Ingress 内部访问、外边访问
  • 31天Python入门——第20天:魔法方法详解
  • TruPlasma RF 1002-G2/13 软件 TruPlasma RF 1003-G2/13软件 TRUMPF 调试监控软件
  • SQL Server:用户权限
  • 系统设计:高并发策略与缓存设计
  • 003-JMeter发起请求详解
  • LVS高可用负载均衡