ACM实训

【碎碎念】继续搞习题学习,今天完成第四套的ABCD,为下一周挤出时间复习,加油

Digit Counting

问题

法希姆喜欢解决数学问题。但有时解决所有的数学问题对他来说是一个挑战。所以有时候他会为了解决数学难题而生气。他拿起一支粉笔,开始写一个从1到N (1 < N < 10000)开始的连续整数序列。之后,他计算每个数字(0到9)在序列中出现的次数。例如,当N = 13时,序列为。

12345678910111213
这个顺序很有趣,对吧?在这个序列中,0(0)出现一次,1(1)出现6次,2(2)出现2次,3(3)出现3次,从4(4)到9(9)的每个数字出现一次。玩了一会儿后,法希姆又觉得无聊了。现在,他想为自己编写一个程序。你的任务是帮助他编写这个程序。

输入
仔细查看输入文件。它由几个数据集组成。输入文件的第一行包含数据集的数量,它是一个不大于20的正整数。下面几行描述了数据集。对于每个测试用例,有一行包含数字N。

输出
现在对于每个单独的测试用例,在一行中顺序地写数字0,1,…用一个空格隔开。

样例输入
2
3
13
样例输出
0 1 1 1 0 0 0 0 0 0
1 6 2 2 1 1 1 1 1 1 1
请注意
您可以使用C/ c++ /Java提交您的解决方案。如果你想用JavaScript提交你的解决方案,那就问志愿者。

思路

把前n(n<=10000)个整数顺次写在一起:123456789101112···数一数0~9各出现多少次(输出10个整数,分别是0,1,···,9出现的次数)。

代码 

#include<stdio.h> 
#include<string.h>
int cnt[10];
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		memset(cnt,0,sizeof(cnt));//给数组赋值为0 
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){//条件不可变 
			int num=i;
			while(num){
				cnt[num%10]++;
				num/=10;
			}
		}
		for(int i=0;i<10;i++) printf("%d ",cnt[i]);
	}
	return 0;
}

Add All

对我来说稍微有一点难,可以先放置

问题

是的! !问题名称反映了你的任务;只要加上一组数字。但是你可能会觉得写一个C/ c++程序只是为了添加一组数字是一种屈尊。这样的问题只会质疑你的学识。所以,让我们加入一些独创性的味道。

加法运算现在需要代价,代价就是这两个相加的和。所以,1加10,需要花费11。如果你想加1 2 3。有几种方法

1 + 2 = 3,成本= 3
3 + 3 = 6,成本= 6
合计= 9

1 + 3 = 4,成本= 4
2 + 4 = 6,成本= 6
总= 10

2 + 3 = 5,成本= 5
1 + 5 = 6,成本= 6
合计= 11


我希望你已经明白你的任务,添加一组整数,使成本最小。
输入
每个测试用例将从一个正数N(2≤N≤5000)开始,然后是N个正整数(均小于100000)。输入以N值为零的情况终止。这个案子不应该处理。
输出
对于每种情况,在单行中打印最小总成本。

 

思路

代码解析

  1. 结构体定义 (struct Num): 定义了一个结构体Num,包含一个成员变量num用于存储数值。通过重载<运算符,使得priority_queue默认按照数值从小到大排序,但实际上我们希望它是最大堆,因此这里的比较逻辑是“当前数大于另一个数”,这样就可以构建最大堆。

  2. 主函数(main)逻辑:

    • 读取输入: 使用scanf读取测试用例个数n,当n不为0时继续执行。
    • 循环处理每个测试用例:
      • 初始化总和sum为0。
      • 使用循环读取n个整数,每次读取后创建Num对象并将其压入优先队列Q中。
      • 当优先队列非空时,循环执行以下操作:
        • 从队列顶部弹出两个最大数(由于我们定义的是最大堆,所以这是自动实现的),求和。
        • 将求得的和累加至sum
        • 若队列中还有其他元素,将求和后的值作为新的元素压入队列。
      • 输出最终的累加和sum
    • 直到没有更多的测试用例,程序结束。
  3. 利用优先队列实现最小累加和:通过持续取出最大两个数相加,并将结果放回队列,确保了每次操作都能最大化减少后续累加过程中的“损失”,从而达到整体最小累加和的目的。

记忆要点

  1. 优先队列与堆的应用:理解优先队列(尤其是最大堆)在处理需要频繁访问最大/最小元素的问题中的优势。
  2. 结构体与运算符重载:通过自定义结构体和重载比较运算符来适应特定的数据结构需求。
  3. 贪心策略:每次选取最大两个数相加,体现了贪心算法的思想,局部最优选择往往能导向全局最优解。
  4. 循环终止条件:注意在只剩一个或零个元素时终止循环,避免不必要的操作。
  5. 输入输出格式处理:掌握基本的输入输出函数如scanfprintf的使用,注意格式控制。
#include<iostream>
#include<cstdio>      // 包含标准输入输出函数,如scanf/printf
#include<queue>       // 包含队列容器相关的实现,包括优先队列
#include<functional>  // 提供函数对象相关功能,这里用于优先队列自定义排序规则
using namespace std;

typedef long long LL;  // 定义长整型别名,方便表示大整数

int n;                 // 用于存储输入的整数数量

int main(){
    // 循环读取测试用例,直到输入为0为止
    while(scanf("%d",&n)==1&&n){
        LL ans=0;         // 初始化答案变量为0,用于累加计算结果
        // 定义一个优先队列pq,其中元素类型为int,基于vector容器,使用greater<int>使得队列顶部元素始终是最小的
        priority_queue<int,vector<int>,greater<int> > pq;
        
        // 读取n个整数并压入优先队列
        for(int i=0;i<n;i++){
            int x; scanf("%d",&x);
            pq.push(x);
        }
        
        // 进行n-1轮操作,每轮取出队列顶部的两个最小元素相加,然后将和重新压入队列
        for(int i=0;i<n-1;i++){
            int x=pq.top(); pq.pop();    // 取出并删除队列顶部的最小元素x
            int y=pq.top(); pq.pop();    // 再次取出并删除队列顶部的最小元素y
            ans+=x+y;                  // 将x和y的和累加到答案变量ans中
            pq.push(x+y);              // 将x+y压回优先队列
        } 
        
        // 输出最终计算得到的答案
        printf("%lld\n",ans);
    }
    return 0;           // 程序正常结束,返回0
}

代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<functional>
using namespace std;

typedef long long LL;
int n;

int main(){
	while(scanf("%d",&n)==1&&n){
		LL ans=0;
		priority_queue<int,vector<int>,greater<int> > pq;
		for(int i=0;i<n;i++){
			int x; scanf("%d",&x);
			pq.push(x);
		}
		for(int i=0;i<n-1;i++){
			int x=pq.top(); pq.pop();
			int y=pq.top(); pq.pop();
			ans+=x+y;
			pq.push(x+y);
		} 
		printf("%lld\n",ans);
	}
	return 0;
}

Oil Deposits 

问题

GeoSurvComp地质调查公司负责探测地下油藏。GeoSurvComp每次只处理一个大的矩形区域,并创建一个网格,将土地划分成无数的方形地块。然后,它使用传感设备分别分析每个地块,以确定地块是否含有石油。 含有石油的地块称为口袋。如果两个储层相邻,那么它们就是同一个油藏的一部分。石油蕴藏量很大,可能包含无数的油穴。你的工作是确定在一个网格中有多少不同的石油储藏。.

 

Input 

输入文件包含一个或多个网格。每个网格以包含m和n的行开始,这是网格中的行数和列数,用一个空格分隔。如果m = 0,则表示输入结束。接下来是m行,每行n个字符(不包括行尾字符)。每个字符对应一个情节,“*”代表没有石油,“@”代表有石油的口袋。

 

Output 

对于每个网格,输出不同的石油储量的数量。如果两个不同的袋体在水平、垂直或对角线上相邻,则它们是同一油藏的一部分。一个石油矿床将不超过100个油袋。 

思路

#include <cstdio>      // 包含标准输入输出函数
#include <cstring>     // 包含字符串操作函数
#include <algorithm>   // 包含算法操作函数
using namespace std;

int r, c;             // r: 地图的行数,c: 地图的列数
int fx[9] = {0, 0, 1, -1, -1, -1, 1, 1}, fy[9] = {1, -1, 0, 0, -1, 1, -1, 1}; // 方向数组,用于八连通搜索
char mapp[105][105];   // 二维字符数组,用于存储地图信息
int s;                // 计算油桶的总数

// 深度优先搜索函数,遍历与当前位置相邻的油桶
void dfs(int x, int y) {
    mapp[x][y] = '*'; // 标记当前油桶位置为已访问,用'*'代替
    // 遍历八个方向
    for (int i = 0; i < 8; i++) {
        int a = x + fx[i]; // 新的位置行坐标
        int b = y + fy[i]; // 新的位置列坐标
        // 检查新位置是否在地图范围内且为未访问的油桶('@')
        if (a > 0 && a <= r && b > 0 && b <= c && mapp[a][b] == '@') {
            dfs(a, b); // 递归访问新位置
        }
    }
}

int main() {
    // 循环读取测试用例,直到输入的行数为0
    while (scanf("%d %d", &r, &c) == 2 && r != 0) {
        s = 0; // 初始化计数器
        // 读取地图信息
        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= c; j++) {
                scanf(" %c", &mapp[i][j]); // 注意空格,避免读取前导空白字符
            }
        }
        // 遍历地图,对每个油桶发起深度优先搜索
        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= c; j++) {
                if (mapp[i][j] == '@') {
                    dfs(i, j); // 发起搜索
                    s++;       // 搜索完一个油桶集合,计数加一
                }
            }
        }
        printf("%d\n", s); // 输出当前地图的油桶集合数量
    }

    return 0; // 程序结束
}

什么是八连通

八连通(八向连通)是计算机视觉、图像处理和图形学领域中的一个概念,主要应用于分析和处理数字图像中的连通性问题。在处理二值图像时,连通性用来识别和区分不同的目标或区域。具体来说:

八连通意味着在二维空间中,对于每一个像素,如果它与其上下左右以及对角线方向(左上、右上、左下、右下)上的相邻像素具有相同的属性(比如都是白色或者都是黑色),则认为这些像素是八连通的。换句话说,从图像中的任意一个像素出发,如果能够仅通过这八个方向之一到达另一个具有相同属性的像素,那么这两个像素就属于同一个连通区域。

这段代码定义了两个数组fxfy,它们分别代表了在二维平面上移动时的横坐标(x轴)和纵坐标(y轴)的变化量,用于实现八连通性搜索。八连通意味着从一个点出发,可以向上、下、左、右以及对角线方向(左上、右上、左下、右下)移动并仍然保持在相连的区域内。具体解释如下:

  • fx[9] = {0, 0, 1, -1, -1, -1, 1, 1}:

    • fx数组存储了x轴方向的变化量。每个值代表相对于当前位置在x轴上可能移动的方向:
      • 0, 0: 第一个0是占位符,实际上并不使用(因为数组索引从0开始,但实际有效方向从1计数)。
      • 1: 向右移动。
      • -1: 向左移动。
      • -1, -1, 1, 1: 分别对应向上右、上左、下右、下左的对角线移动。
  • fy[9] = {1, -1, 0, 0, -1, 1, -1, 1}:

    • fy数组存储了y轴方向的变化量,与fx数组对应的每个方向上的y坐标变化:
      • 1: 向上移动。
      • -1: 向下移动。
      • 0, 0: 同样,前两个0是占位符,实际上代表水平移动时y轴无变化。
      • -1, 1, -1, 1: 对应于对角线方向上y坐标的增减。

 

1.定义dfs函数,运用到八连通

2.扫描地图

3.把有@的数据传到dfs函数中 

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int r, c;
int fx[9] = {0, 0, 1, -1, -1, -1, 1, 1}, fy[9] = {1, -1, 0, 0, -1, 1, -1, 1};
char mapp[105][105];
int s;

void dfs(int x, int y) {
    mapp[x][y] = '*'; // 把等于@的都变成*,因为它们属于同一油桶
    for (int i = 0; i < 8; i++) {
        int a = x + fx[i];
        int b = y + fy[i];
        if (a > 0 && a <= r && b > 0 && b <= c && mapp[a][b] == '@') {
            dfs(a, b);
        }
    }
}

int main() {
    while (scanf("%d %d", &r, &c) == 2 && r != 0) {
        s = 0;
        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= c; j++) {
                scanf(" %c", &mapp[i][j]); // 注意增加空格忽略空白字符
            }
        }
        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= c; j++) {
                if (mapp[i][j] == '@') {
                    dfs(i, j);
                    s++;
                }
            }
        }
        printf("%d\n", s);
    }

    return 0;
}

Dungeon Master

这道题好难呀QAQ   打算放弃

问题

Description - 题目描述

你进入了一个3D的宝藏地宫中探寻宝藏到了宝藏,你可以找到走出地宫的路带出宝藏,或者使用炉石空手回家。

地宫由立方体单位构成,立方体中不定会充满岩石。向上下前后左右移动一个单位需要一分钟。你不能对角线移动并且地宫四周坚石环绕。
请问你是否可以走出地宫带出宝藏?如果存在,则需要多少时间?

Input - 输入

每个地宫描述的第一行为L,R和C(皆不超过30)。
L表示地宫的层数。
R和C分别表示每层地宫的行与列的大小。
随后L层地宫,每层R行,每行C个字符。
每个字符表示地宫的一个单元。'#'表示岩石单元,'.'表示空白单元。你的起始位置在'S',出口为'E'。
每层地宫后都有一个空行。L,R和C均为0时输入结束。

Output - 输出

每个地宫对应一行输出。
如果可以带出宝藏,则输出
Escaped in x minute(s).
x为最短脱离时间。
如果无法带出,则输出
Trapped!

思路

感觉这道题是上一道找石油的升级版,由两维升级到三维

代码

#include <iostream>
#include<queue>
#include<string.h> 
using namespace std;

struct pp
{
int x;
int y;
int z;
};//定义数据结构pp,用于储存三维坐标

queue<pp> s;//创建队列
pp ne, st;//st为起点的坐标,ne为每次朝六个方向探索时的可行坐标
int x, y, z,ans;//xyz为输入的内容,ans记录答案。
const int N = 35;
char a[N][N][N];
int d[N][N][N];//存储到达每个位置所需要的最短步数
int dx[6] = { -1,0,0,1,0,0 }, dy[6] = { 0,-1,0,0,1,0 }, dz[6] = { 0,0,-1,0,0,1 };//上下左右前后六个坐标的延伸


int bfs()
{
ans = -1;
memset(d, -1, sizeof d);//将d数组数据全部设置为-1
for (int i = 0; i < z; i++)
for (int j = 0; j < y; j++)
for (int k = 0; k < x; k++)
{
if (a[k][j][i] == 'S')
{
st.x = k, st.y = j, st.z = i;
d[k][j][i] = 0;
s.push(st);
break;
}
}//寻找起点S的位置,然后将起点坐标入队列,该点所在的d设为0
while (s.size())
{
pp temp = s.front();//取出队首元素
s.pop();//弹出队首元素
if (a[temp.x][temp.y][temp.z] == 'E')
{
ans= d[temp.x][temp.y][temp.z];
while (s.size()) s. pop();
break;
}//如果找到终点,终止循环
for (int i = 0; i < 6; i++)
{
int x1 = temp.x + dx[i];
int y1= temp.y + dy[i];
int z1 = temp.z + dz[i];
if (x1 < 0 || x1 >= x || y1 < 0 || y1 >= y || z1 < 0 || z1 >= z || d[x1][y1][z1] != -1 || a[x1][y1][z1] == '#') continue;
if(a[x1][y1][z1]=='.'||a[x1][y1][z1]=='E')
{
ne.x = x1, ne.y = y1, ne.z = z1;
d[x1][y1][z1] = d[temp.x][temp.y][temp.z] + 1;
s.push(ne);
}
}
}//每次朝六个方向延伸,如果该坐标可行则将该点坐标入队列,然后刷线该点所在的d数组的值。
return ans;
}


int main()
{
cin.tie(0);
while (cin>>z>>y>>x&&(x!=0||y!=0||z!=0))
{
for (int i = 0; i < z; i++)
for (int j = 0; j < y; j++)
for (int k = 0; k < x; k++)
cin >> a[k][j][i];
if (bfs() != -1) cout << "Escaped in " << bfs() << " minute(s)." << endl;
else cout << "Trapped!" << endl;
}

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过管理系统完成商品属性维护

文章目录 1.数据库表设计1.商品属性表 2.renren-generator生成CRUD1.基本配置检查1.generator.properties2.application.yml 2.启动RenrenGeneratorApplication.java生成CRUD1.启动后访问localhost:812.生成商品属性表的crud 3.将crud代码集成到项目中1.解压&#xff0c;找到ma…

Java日志冲突问题

在今天的 Maven 构建过程中&#xff0c;我遇到了 SLF4J 和 Logback 之间的依赖冲突问题。以下是对这些问题的总结以及相应的解决方案。 问题描述: Maven 构建中 SLF4J 和 Logback 依赖冲突问题总结 日志警告&#xff1a; SLF4J: Class path contains multiple SLF4J binding…

flannel详细介绍

一、前言 Flannel 是一个简单、高效的容器网络解决方案&#xff0c;适用于需要在多个主机上运行容器的场景。它通过虚拟网络技术和 IP 地址管理来实现容器之间的通信和跨主机连接&#xff0c;为容器平台提供了可靠的网络基础设施&#xff0c;flannel有三种模式&#xff0c;分别…

sudo pip3 install rpi_ws281x error: externally-managed-environment

报错 error: externally-managed-environment piraspberrypi:~ $ sudo pip3 install rpi_ws281x error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz i…

如何自建谷歌站点?

自建谷歌站点其实是一个相对简单的过程&#xff0c;主要是指创建一个能够被谷歌搜索引擎索引和搜索的网站 首先要做的自然就是选择一个域名&#xff0c;域名基本就相当于你的门牌号了&#xff0c;你得想一个既好记又能代表你网站内容的名字&#xff0c;注册域名可以去很多网站…

【Qt】之【Bug】C2001 常量中有换行符

分析 参考&#xff1a;Qt记录&#xff1a;Qt编程遇C2001错误&#xff0c;提示“常量中有换行符”_qt 常量中有换行符-CSDN博客 原因 字符串中有中文字符 &#xff1a;使用了中文标点符号&#xff01; 解决 中文感叹号改为英文的

基于transformers框架实践Bert系列4-文本相似度

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

RisingWave 用户定义函数 (一) :概览

&#xff5c;作者&#xff1a;王润基 RisingWave Labs 内核开发工程师 用户定义函数&#xff08;User Defined Function&#xff0c;以下简称 UDF&#xff09;是数据系统中的常见功能。它允许用户使用各种语言定义自己的函数&#xff0c;作为内置函数的补充&#xff0c;以实现…

【前端】使用 Canvas 实现贪吃蛇小游戏

使用 Canvas 实现贪吃蛇小游戏 在这篇博客中&#xff0c;我们将介绍如何使用 HTML5 Canvas 和 JavaScript 实现一个简单的贪吃蛇&#xff08;Snake&#xff09;小游戏。这个项目是一个基础的游戏开发练习&#xff0c;它可以帮助你理解如何在 Canvas 上绘图、如何处理用户输入以…

【九十三】【算法分析与设计】719. 找出第 K 小的数对距离,N 台电脑的最长时间,二分答案法

719. 找出第 K 小的数对距离 - 力扣&#xff08;LeetCode&#xff09; 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 0 < i < j < nums.le…

校园网拨号上网环境下多开虚拟机,实现宿主机与虚拟机互通,并访问外部网络

校园网某些登录客户端只允许同一时间一台设备登录&#xff0c;因此必须使用NAT模式共享宿主机的真实IP&#xff0c;相当于访问外网时只使用宿主机IP&#xff0c;此方式通过虚拟网卡与物理网卡之间的数据转发实现访问外网及互通 经验证&#xff0c;将centos的物理地址与主机物理…

UMPNet: Universal Manipulation Policy Network for Articulated Objects

1. 摘要 UMPNet是一个基于图像的策略网络&#xff0c;能够推理用于操纵铰接物体的闭环动作序列。该策略支持6DoF动作表示和可变长度轨迹。 为处理多种类的物体&#xff0c;该策略从不同的铰接结构中学习&#xff0c;并泛化到未见过的物体或类别上。该策略是以自监督探索的方式…

利用Python队列生产者消费者模式构建高效爬虫

目录 一、引言 二、生产者消费者模式概述 三、Python中的队列实现 四、生产者消费者模式在爬虫中的应用 五、实例分析 生产者类&#xff08;Producer&#xff09; 消费者类&#xff08;Consumer&#xff09; 主程序 六、总结 一、引言 随着互联网的发展&#xff0c;信…

css使用clip-path裁剪出不规则图形并绑定点击事件

点击图片的红色区域触发事件 点击图片黑色不触发点击事件&#xff0c;代码演示效果如下&#xff1a; 代码演示效果 1.png&#xff08;尺寸 200*470&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

2025第十届美陈展

展位又遭疯抢&#xff01;2025第十届美陈展释放“无界之美” 美是全球通用的语言&#xff0c;人类对美的追求始终如一&#xff0c;大众审美在经历了时代的变迁后开始趋同&#xff0c;东方文明深处的美学经济开始崛起。 在如今商业迈入存量阶段&#xff0c;以品牌为突破口打造…

抽象工厂模式(AbstractFactoryPattern)

文章目录 1.抽象工厂模式定义2.UML类图3.抽象工厂模式具体实现工厂模式实现单一产品族抽象工厂实现多产品族产品类工厂类使用 4.抽象工厂模式优缺点 1.抽象工厂模式定义 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 工厂方法模式是单一产…

JavaScript-运算符

算术运算符 返回结果为数字型的运算符 加法运算符 加法运算符&#xff08;&#xff09;是一个二元运算符&#xff0c;可以对两个数字型的操作数进行相加运算&#xff0c;返回值是两个操作数的和 减法运算符 减法运算符&#xff08;-&#xff09;是一个二元运算符&#xff0c;可…

banner2.0自定义轮播布局

说明&#xff1a;最近碰到一个需求&#xff0c;让新闻列表实现轮播图的效果&#xff0c;也就是轮播新闻&#xff0c;然后样式必须按照ui设计的样式来弄&#xff0c;之前传统的banner&#xff0c;都是只轮播图片&#xff0c;没想到&#xff0c;这次居然要轮播新闻&#xff0c; 网…

【深度学习】YOLOv8训练,交通灯目标检测

文章目录 一、数据处理二、环境三、训练 一、数据处理 import traceback import xml.etree.ElementTree as ET import os import shutil import random import cv2 import numpy as np from tqdm import tqdmdef convert_annotation_to_list(xml_filepath, size_width, size_he…

java+ vue.js+uniapp一款基于云计算技术的企业级生产管理系统,云MES源码 MES系统如何与ERP系统集成?

java vue.jsuniapp一款基于云计算技术的企业级生产管理系统&#xff0c;云MES源码&#xff0c;MES系统如何与ERP系统集成&#xff1f; MES系统&#xff08;制造执行系统&#xff09;与ERP系统&#xff08;企业资源规划系统&#xff09;的集成可以通过多种方式实现&#xff0c;这…