中山大学_程序设计新手赛2023_4题的小朋友_总结

news2025/1/21 15:41:07

送自己一句话:即使生活很不顺利,也不要成为一个连自己都讨厌的人

那样,当你有一天回首过往,只不过是在演戏中匆匆做过这一生

题目:见我上传的资源

A:关于时间复杂度

解:

1.关键:

法一:手算,反正我们开始3个人就是每个人在草稿纸上令n =10^5手算 执行的语句的数量是否会超过10^8,虽然一开始就做对了,几分钟的事情,但是,我们提交的时候因为没有<<endl,所以提交错了4次,怎么说,哎,比赛,没办法,它也没说

法二:这是我们在纠结的过程中 其中锟同学 按照一个程序员的思维提出的,为什么不把这4段代码运行一下,看看执行次数呢? ---.....................真是,太。。。妙了

2.代码:

注:没有代码的。。

B:老实点,每次都有你

解:

1.关键:

(1)讲了很多故事,但是如果把故事的内容进行提炼的话,就是说 找出这一行数据中的 公因数,然后 从小到大 输出这个公因数的 所有因子

(2)注意,为了减少时间复杂度,我们考虑就是 就是从1-sqrt(n)中找因子i,另一个因子就是gcd/i了

然后存储到数组 ans,最后sort一下数组即可

2.代码如下:

int gcd(int a, int b)
{
	//a > b
	if (a < b)
	{
		swap(a, b);
	}
	while (a%b != 0)
	{
		int tmp = b;
		b = a % b;
		b = tmp;
	}
	return b;
}

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		int n;
		cin >> n; //输入n个整数
		vector<int> arr(n, 0);
		for (int i = 0; i < n; i++)
		{
			cin >> arr[i];
		}
		//(1)先利用依次 gcd,求解出公因数 common_num
		int common_num = arr[0];
		for (int i = 1; i < n; i++)
		{
			common_num = gcd(common_num, arr[i]);
		}
		cout << common_num << endl;
		//(2)然后利用检查 <=sqrt(common_num)  中是否有 % == 0 的因子
		vector<int> ans;
		for (int i = 1; i <= sqrt((double)common_num); i++)
		{
			if (common_num % i == 0)
			{
				ans.push_back(i);
				if(i != common_num/i)
				ans.push_back(common_num / i); //防止重复
			}
		}
		sort(ans.begin(), ans.end()); //排序
		//然后输出
		for (auto item : ans)
		{
			cout << item << " ";
		}
		cout << endl;
	}
	return 0;
}

C:木桶效应

解:

1.关键:

(1)我承认这个题目是 我的败笔,不过,人生有比这个更加令人忧伤的事情,所以,少年,从头开始,不必灰心,

(有的时候会有一些计较,但是,你想啊,单单和 广州计算机学院的同学就差距这么大了,更何况是浙江北京的那些同学呢,对吧,当你计较的时候,你已经输了,ok,心宽了就好)

(2)这个题目其实总的思路是,先得到二维数组vec_set(负责存放不同的桶子,筒子里面是元素),得到不同元素映射到的 桶子编号 map<x , index_bucket> ,然后对每个vec_set中的桶子进行sort,最后  分情况去输出1-n

(3)赛后想法:为了避免 合并2个桶子(因为后期可能出现 “桥梁元素”),我考虑使用图论的思想,先建图(得到一个二维数组graph作为邻接表),然后通过 bfs广搜得到一个个桶子中的所有元素,并且存放到cnt_bucket中

(4)说明一点,我用了一个 num_set来存储 爷爷提及的元素,这样最后可以单独把那些没有提及的元素 都单独作为新的bucket 放到 vec_set的末尾

2.代码如下:

#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<unordered_set>

using namespace std;

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		int n, m;
		cin >> n >> m;
		//算了,再利用一个set用来存储爷爷提及到的元素
		unordered_set<int> num_set;
		//一个大小为m的二维数组
		vector<vector<int>> vec(m, vector<int>(2, 0));
		//二维数组邻接表
		vector<vector<int>> graph(n+1); //总共有n个节点 -input 1 10 --error
		for (int i = 0; i < m; i++)
		{
			cin >> vec[i][0] >> vec[i][1];
			int x = vec[i][0], y = vec[i][1];
			//--记录爷爷提及到的 元素
			if (num_set.count(x) == 0)
			{
				num_set.insert(x);
			}
			if (num_set.count(y) == 0)
			{
				num_set.insert(y);
			}
			graph[x].push_back(y); graph[y].push_back(x);  //悟了,graph从下标0开始,所以需要n+1大小
		}
		//(1)利用1个二维数组vec_set 和 一个map<num , bucket_index>记录 木板对应的桶子的index
		//先得到所有的 vec_set
		vector<vector<int>> vec_set;
		unordered_map<int, int> map;
		//我在想怎么可以做到 规避掉 需要合并2个bucket的 这个步骤
		//我尼玛,这不就是一个图论问题吗? 1个木桶中的木板相当于是节点,每个木桶是一个连通分量
		//那,首先不得邻接表建图啊
		//然后每个连通分量最为一个 vector 放到vec_set中不可以吗
		//一个时间复杂度可能比较高 算法是 利用bfs广搜思想,找到1个连通分量的 所有 节点
		int cnt_bucket = 0;
		for (int i = 1; i <= n; i++)  
		{
			//如果是爷爷没有提及到的 元素,直接continue
			if (map.count(i) != 0 || num_set.count(i) == 0)
			{
				//已经访问过这个节点了 或者  爷爷没有提及到这个元素
				continue;
			}
			else
			{
				//没有访问过,需要bfs,搜索得到一个新的 连通分量
				queue<int> q;
				//<0>初值
				q.push(i);
				vector<int> new_bucket;
				while (!q.empty())
				{
					int first = q.front();
					q.pop();//取出队首元素 , 然后记得出队
					//然后开始加入到map中,并且取出邻接表中的 && 没有在map中count的元素入队
					map[first] = cnt_bucket;
					new_bucket.push_back(first);
					//--入队
					int size = graph[first].size(); //这里越界访问了吗,越界了,这里访问有问题
					for (int j = 0; j < size; j++)
					{
						if (map.count(graph[first][j]) == 0)
						{
							//没有访问过,那就入队
							q.push(graph[first][j]);
						}
					}
				}
				cnt_bucket++;  //这时候才让bucket的数量++,计数是从1开始计数的,但是从0开始使用数组
				vec_set.push_back(new_bucket);
			}
		}
		//错误发生在以上代码中。。。
		//--补充爷爷没有回忆到的那些元素,都 单独作为一个bucket
		for (int i = 1; i <= n; i++)
		{
			if (map.count(i) == 0)
			{
				//创建一个 新的 一维数组
				vector<int> new_bucket;
				new_bucket.push_back(i);
				vec_set.push_back(new_bucket);
				//--又忘记更新map了
				map[i] = cnt_bucket++;
			}
		}

		

		//(2)将vec_set中的所有1维结果全部sort一遍好了
		for (int i = 0; i < cnt_bucket; i++)
		{
			sort(vec_set[i].begin(), vec_set[i].end());
		}

		//调试1:构建的 vec_set二维数组是否有问题呢? --没问题,也就是最后一步逻辑有问题了
		/*cout << "调试vec_set数组 :" << endl;
		for (auto bucket : vec_set)
		{
			for (auto item : bucket)
			{
				cout << item << " ";
			}
			cout << endl;
		}*/

		//(3)最后一步,
		unordered_set<int> cout_set;  //输出1-n,反正
		for (int i = 1; i <= n; i++)
		{
			//<1>如果已经输出过
			if (cout_set.count(i))
			{
				continue;
			}
			//<2>否则找到i所在的 vec_set中的下标,然后全部从后往前输出
			int index = map[i];
			int size = vec_set[index].size();
			for (int j = size - 1; j >= 0; j--)
			{
				//忘记用cout_set记录了
				cout_set.insert(vec_set[index][j]);
				cout << vec_set[index][j] << " ";
			}

		}
		cout << endl;
	}
	return 0;
}

D.究极手:(给出一组节点 和 对应的度数 , 然后 构建一棵无向树)

解:

法一:

(我自己的 贪心算法)

代码如下:

#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<unordered_set>
#include<utility>
#include<queue>

using namespace std;

bool compare(pair<int, int> a, pair<int, int> b)
{
	return a.second > b.second;
}

int main()
{
	//第一下反应 就知道这是一个图论的问题,
	//思路:这不就是 给定不同节点的度数 , 然后构建一个无向连通无环简单图(构建一棵树)吗?妙
	//数据结构:1个队列queue<pair<int,int>>,存放<1-n , remain_degree>,每次从队首开始
	//利用一个vec[1-n]存放初始各个节点的degree ,初始让vec[1]make_pair入队
	//往后,每次将队首节点的degree-1,并且加入 下一个节点,如果有degree变为0,出队 或者 不入队
	//用一个二维数组ans存放边的结果
	//最终如果queue为空--输出ans,否则输出-1
	//-------------------------------------------------------
	//先考虑一次:
	int T;
	cin >> T;
	while (T--)
	{
		queue<pair<int, int>> q;
		int n; cin >> n; //节点个数
		vector<int> vec(n+1, 0);
		vector<pair<int, int>> vec2(n + 1);
		vector<pair<int,int>> ans; //节点对 的容器
		for (int i = 1; i <= n; i++)
		{
			cin >> vec[i]; //输入节点的度数
			vec2[i] = make_pair(i, vec[i]); //<节点下标, 度数>
		}
		//--对vec2进行sort , 利用自己写的 那个根据 度数降序排序的bool返回类型的 compare函数
		sort(vec2.begin() + 1, vec2.end(), compare);
		//--正式开始构建一个树:
		//(1)第一个节点入队
		q.push(vec2[1]);
		//(2)将2-n号节点依次加入,不对,我觉得应该要让节点数目最多的节点先入队 , 有点贪心的感觉
		//不管了,之后再去查资料看一下 到底如何构建一棵树,那就先让节点数最多的先入队
		int flag = 1;//可以构建置1
		for (int i = 2; i <= n; i++)
		{
			//先判断队列是否为空
			if (q.empty())
			{
				cout << "-1"; // 说明无法构建
				flag = 0;
				break;
			}
			//--,取出队首元素,然后度数-1,新加入的节点的度数也-1
			pair<int, int>& front_vex = q.front();  //传递引用

			//--加入到ans中
			ans.push_back(make_pair(front_vex.first, vec2[i].first));

			front_vex.second--;
			vec2[i].second--;
			//--判断度数是否为0
			if (front_vex.second == 0)
			{
				q.pop();
			}
			if (vec2[i].second != 0) //入队
			{
				q.push(vec2[i]);
			}
			
		}
		//(3)最终结果判断
		if (flag == 1 && q.empty())
		{
			int size_tmp = ans.size();
			for (int i = 0; i < size_tmp; i++)
			{
				cout << ans[i].first << " " << ans[i].second << endl;
			}
		}
		else if (flag == 1)
		{
			cout << -1 << endl;
		}
		
	}

	return 0;
}

解释:

(1)我考虑的是“贪心”的思想!!! --对,就是贪心,我感觉证明了之后不会有 更优的构建方法了,哈哈哈哈哈

(2)vec[i]中存放的就是 第i个节点的  下标 和 度数 <index , degree>

(3)先排序,通过给 sort函数的 第三个参数 传递一个 compare函数 ,按照degree从大 到小排序

(4)利用一个队列q,

(5)先让 第一个degree最大的节点入队,然后每次 队首元素的度数减1,入队元素的 度数减1

(6)最后判断队列是否为空

法二:(官方解法,非常巧妙的 利用了 一个 “递归”思想)

代码:很简单,之后再写。。。

思想:

(1)

n==1 或者 2 : 显然

n>2时

总共的度数 为 2*n-2,那么,这n个节点中,根据鸽巢原理,一定至少有一个度数为1的节点,也一定至少有一个度数大于1的节点

因为 ,如果都>=2 ,2*n!=2*n-2 ; 如果都为1, n!= 2*n-2

(2)这时候,我们  这一对 1度数 和 >1度数连一条边,然后 n -> n-1个节点,2n-2度数 ->2*(n-2)-2度数,同样 这n-1个节点中,一定有 度数为1 和 大于1....妙!

E:Password (解一个二元不定方程)

解:

好吧,原来这种题目需要。。。找规律。。。我。。。

规律时 0,1,1,2,3,5,8......这个斐波那契数列的 奇数项带进去。。。

具体的证明如下:

 

 代码如下:

#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<unordered_set>
#include<utility>
#include<queue>

using namespace std;

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		//从0-n之间找到对应的解带进去,
		int n;
		cin >> n;
		//--
		//干脆先生成一个从0开始的斐波那契数列 ,然后 取出 恰好小于n的奇数个作为ans
		int f1 = 0, f2 = 1;
		//f1作为 第奇数个斐波那契数, f2作为 第偶数个 斐波那契数
		while (f2 <=n && f1 + f2<=n )
		{
			f1 = f1 + f2;
			f2 = f1 + f2;
		}
		cout << f1 << endl;
	}

	return 0;
}

F:熊爷别笑了(本质上是 凸包问题)

解:

1.思路:

(1) “降维”的思路,将 这些半径相同的圆 全部 只考虑圆心的位置, 这种“降维”的思想是非常重要的

(2)这一题有点奥数的味道, 可以像参考题解那么想:用一根绳子,绕着所有的外围的 圆,这样得到的周长一定最短

也可以 直观去感觉, 你想吧,在外围绕一圈是不是 最后回到原点?是不是绕中心转过的角度是360度? 是不是 和 圆心平行的直线的路径最短, 否则两边之和大于 第三边

2.代码:

#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<unordered_set>
#include<utility>
#include<queue>
#include<stack>

using namespace std;


//函数声明:
vector<vector<int>> outerTrees(vector<vector<int>> &trees); // 返回 一个二维数组,就是最终的凸包节点次序
int cross(const vector<int> & p, const vector<int> & q, const vector<int> & r);//计算 极角
double distance(const vector<int> & p, const vector<int> & q); //计算2点之间的距离



int main()
{
	//只需要求一个 凸包,结果 就是凸包的 长度 + 一个圆周的长度即可
	//处理输入:
	int T;
	cin >> T;
	while (T--)
	{
		int n; // 有n个 玩偶
		double R;
		cin >> n >> R;
		vector<vector<int>> trees(n + 1, vector<int>(2, 0));
		for (int i = 1; i <= n; i++)
		{
			cin >> trees[i][0] >> trees[i][1];  //得到坐标点(x,y)
		}
		double total = 0;
		total = total + acos(-1)*R * 2; //先加上 1个 圆周的周长
		//(1)计算凸包的 调用 outerTreees函数,得到一个二维数组,其中存储了 凸包的节点次序的二维数组
		vector<vector<int>> vec = outerTrees(trees);
		int size = vec.size();
		//(2)从头开始计算 这些点两两之间的 距离之和
		total = total + distance(vec[0], vec[size - 1]);
		for (int i = 1; i <= size - 1; i++)
		{
			total += (distance(vec[i - 1], vec[i]));
		}
		//(3)输出结果
		cout << total << endl;
	}
	return 0;
}

vector<vector<int>> outerTrees(vector<vector<int>> &trees) {
	int n = trees.size();
	if (n < 4) {
		return trees;
	}
	int bottom = 0;
	/* 找到 y 最小的点 bottom*/
	for (int i = 0; i < n; i++) {
		if (trees[i][1] < trees[bottom][1]) {
			bottom = i;
		}
	}
	swap(trees[bottom], trees[0]);
	/* 以 bottom 原点,按照极坐标的角度大小进行排序 */
	sort(trees.begin() + 1, trees.end(), [&](const vector<int> & a, const vector<int> & b) {
		int diff = cross(trees[0], a, b);
		if (diff == 0) {
			return distance(trees[0], a) < distance(trees[0], b);
		}
		else {
			return diff > 0;
		}
	});
	/* 对于凸包最后且在同一条直线的元素按照距离从大到小进行排序 */
	int r = n - 1;
	while (r >= 0 && cross(trees[0], trees[n - 1], trees[r]) == 0) {
		r--;
	}
	for (int l = r + 1, h = n - 1; l < h; l++, h--) {
		swap(trees[l], trees[h]);
	}
	stack<int> st;
	st.emplace(0);
	st.emplace(1);
	for (int i = 2; i < n; i++) {
		int top = st.top();
		st.pop();
		/* 如果当前元素与栈顶的两个元素构成的向量顺时针旋转,则弹出栈顶元素 */
		while (!st.empty() && cross(trees[st.top()], trees[top], trees[i]) < 0) {
			top = st.top();
			st.pop();
		}
		st.emplace(top);
		st.emplace(i);
	}

	vector<vector<int>> res;
	while (!st.empty()) {
		res.emplace_back(trees[st.top()]);
		st.pop();
	}
	return res;
}

int cross(const vector<int> & p, const vector<int> & q, const vector<int> & r) {
	return (q[0] - p[0]) * (r[1] - q[1]) - (q[1] - p[1]) * (r[0] - q[0]);
}

double distance(const vector<int> & p, const vector<int> & q) {
	double  tmp = (p[0] - q[0]) * (p[0] - q[0]) + (p[1] - q[1]) * (p[1] - q[1]);
	tmp = sqrt(tmp);
	return tmp;
}

H:Pause , Heal ,Explosion

解:

算了,之后的题目 找个人 比如邱伟林。锟谁的一起看比较好。。。那样比较有意思。。。

未完待续。。。

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

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

相关文章

前端开发之axios请求封装详细讲解

前端开发之axios请求封装 前言1、安装axios2、创建公共文件request3、导入axiso4、初始化axios5、axios请求拦截器6、axios响应拦截器7、handleData&#xff1a;处理请求后来的response8、CODE_MESSAGE&#xff1a;code信息 前言 在vue项目中&#xff0c;和后台交互获取数据这…

openEuler社区人才评定考试流程指引

最近因为公司工作的需要参加考试了openEuler社区人才评定考试&#xff0c;本次考试题型主要包括单选、多选、判断三类题型。考试内容基本都是操作系统使用相关的内容。 考试需要注意事项&#xff1a; 1.考试为线上答题考试&#xff0c;需开启摄像头。 2.考试期间请保持周围环…

SQL server增删改查(1)

SQL server数据类型 整数型: BIGINT INT SMALLINT 小数型: FLOAT DOUBLE 文本型: CHAR VARCHAR NCHAR NVARCHAR TEXT 日期和时间类型 DATE TIME DATETIME 布尔型: BIT 数据类型含义INT长整数(也可以写作INTEGER)SMALLINT短整数CHAR(n)长度为n的定长字符串, 不足n个字符的空白部…

Scala语言入门以及基本语法

文章目录 前言1.环境搭建1) IDEA中插件下载2) SDK下载配置 2.基本使用1&#xff09;var与val的区别2) .基本数据类型3).字符串的基本用法4) 控制结构1) if else2) for 循环3) while循环 5)类6) 函数 前言 scala在一种简洁的高级语言中结合了面向对象和函数式编程。Scala的静态…

8个免费的PNG素材网站推荐

很多设计小白都不知道什么是PNG。事实上&#xff0c;PNG是一种支持透明度的图像格式。当你想在设计中将图像与背景或文本混合时&#xff0c;它就会派上用场。 如果你没有时间为你正在处理的设计创建透明的PNG图像&#xff0c;你也可以使用我收集的PNG素材网站&#xff0c;以便…

【Linux从入门到精通】Linux常用基础指令(中)

本篇文章接上篇文章&#xff08;【Linux从入门到精通】Linux常用基础指令&#xff08;上&#xff09;&#xff09;进行详解。本章的指令相对较为重要&#xff0c;使用频率较高&#xff0c;难度相对上篇文章较难&#xff0c;也较为复杂。希望能对你的理解有所帮助。 文章目录 一…

(Open AI 极简教程)ChatGPT注册登录常见问题及其解决方法最全总结

好久没有更新过技术类的文章了&#xff0c;临近五一假期&#xff0c;首先祝大家假期游玩愉快&#xff0c;也希望本篇文章能够对你有所帮助&#xff0c;今天这篇博客将会把ChatGPT注册中可能遇到的问题彻头彻尾的讲一下&#xff0c;如果感觉有帮助的话就动动你发财的小手点个收藏…

蓝奥声核心技术分享——一种无线低功耗配置技术

1.技术背景 无线低功耗配置技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术涉及物联网边缘域的无线通信技术领域&#xff0c;具体主要涉及网络服务节点…

3.龙芯2k1000 builroot文件系统编译过程

3.龙芯2k1000 builroot文件系统编译过程 文章目录 3.龙芯2k1000 builroot文件系统编译过程&#xff08;一&#xff09;、在Ubuntu环境下载并配置交叉编译链&#xff08;与内核编译工具链相同&#xff09;&#xff08;二&#xff09;、下载buildroot源码&#xff08;三&#xff…

【Linux命令篇】正则表达式浅析

前言 转义字符是将普通字符转化为特殊字符的一种方式。 在正则表达式中&#xff0c;一些字符被定义为特殊字符&#xff08;也称为元字符&#xff09;&#xff0c;它们具有特殊的含义。这些特殊字符包括&#xff1a; 句点字符 .&#xff1a;可以匹配除了换行符以外的任何单个…

JavaScript经典教程(四)-- JavaScript基础 - BOM、打印、window对象等详解

184&#xff1a;JavaScript基础 - BOM、打印、window对象等详解 185&#xff1a;JavaScript基础 - 数据类型Number及运算符号 1、关键字 &#xff08;3&#xff09;alert - 警告窗 原型&#xff1a;window.alert(); alert实际上是一个函数 注&#xff1a;alert无法弹出部分…

Figma如何导出jpg格式?

在这个追求效率和质量的时代&#xff0c;Figma确实可以加快我们的设计工作&#xff0c;增加效率&#xff0c;功能越来越强大。然而&#xff0c;Figma从未有过中文版本。 但就使用工具而言&#xff0c;一次生两次并不难。设计小白经常卡在最后一步&#xff0c;如何用Figma导出j…

【Paper】2022_基于自适应事件触发控制的一般线性多智能体系统的一致性_田昌源

田昌源. 基于自适应事件触发控制的一般线性多智能体系统的一致性[D].青岛大学,2022.DOI:10.27262/d.cnki.gqdau.2022.002546. 文章目录 第五章 一般线性多智能体系统的自适应事件触发二分一致性5.1 系统模型5.2 自适应事件触发二分一致性5.2.1 无领导一致性5.2.2 领导-跟随一致…

JDK的环境配置(超级详细教程)

JDK的环境配置——超详细教程 一、下载java安装包 我们可以去官网下载java&#xff0c;进入官网页面&#xff0c;然后点击Download Java。 网站&#xff1a;https://developer.oracle.com/languages/java.html 里面有各种版本的jdk可供选择。 二、安装JDK 这里我选择安装…

Android实现一个带清除和提交按钮的清爽圆角搜索框

运行效果&#xff1a; 放入Toolbar的效果 清除按钮有内容才显示&#xff1a; 下面是教程&#xff1a; 实现一个圆角搜索框&#xff0c;可以使用CardView来实现&#xff0c;同时可以添加一个EditText和两个ImageView作为清除和提交按钮。 activity_main <?xml version&quo…

Anaconda3 安装 Tensorflow-gpu

一.准备需要 GPU版本&#xff0c;需要提前下载 cuda 和 cuDNN。&#xff08;可以查看此教程 Anaconda3 安装 Tensorflow-gpu &#xff09; GPU 一般是 nvidia 的 安装前 一定 要查看自己电脑的环境配置&#xff0c;然后查询Tensorflow-gpu、Python、 cuda 、 cuDNN 版本关系&…

嵌入式设备显示屏相关概念汇总

嵌入式设备常用的显示屏接口 LCD 接口&#xff1a;是一种常见的数字电路接口&#xff0c;支持多种显示器件&#xff0c;如字符型液晶显示器和点阵型液晶显示器等。 VGA 接口&#xff1a;是一种视频接口标准&#xff0c;用于连接显示器和计算机。该接口提供模拟 RGB 信号&#…

以太网卡TSO、GSO、LRO、GRO描述及相关配置

以太网卡TSO、GSO、LRO、GRO描述及相关配置 以太网卡的 TSO、GSO、LRO、GRO 是一些传输协议中用于提高网络性能的技术。 硬件包拆分与合并 TSO&#xff08;TCP Segmentation Offload &#xff09; TSO 是一种由网卡卸载 TCP 数据包分段的技术。在传统的方式中&#xff0c;当…

案例01-tlias智能学习辅助系统04-登录认证+全局异常处理

目录 1、基础登录 2、登录校验 2.1、会话跟踪技术&#xff1a; Cookie、Session JWT令牌 2.2、请求过滤 方式一、过滤器&#xff08;Filter&#xff09; 方法二&#xff1a;拦截器&#xff08;interceptor&#xff09; Filter与Interceptor的区别 3、全局异常处理器 1、…