第十六届蓝桥杯大赛软件赛C/C++大学B组部分题解

news2025/5/10 0:08:35

第十六届蓝桥杯大赛软件赛C/C++大学B组题解

试题A: 移动距离

问题描述

小明初始在二维平面的原点,他想前往坐标(233,666)。在移动过程中,他只能采用以下两种移动方式,并且这两种移动方式可以交替、不限次数地使用:

  1. 水平向右移动,即沿着x轴正方向移动一定的距离。
  2. 沿着一个圆心在原点(0,0)、以他当前位置到原点的距离为半径的圆的圆周移动,移动方向不限(即顺时针或逆时针移动不限)。

在这种条件下,他到达目的地最少移动多少单位距离?你只需要输出答案四舍五入到整数的结果。

解题思路

这个问题可以转化为:如何从原点到达目标点,使得路径长度最小。

首先,我们可以观察到,如果目标点在x轴上,那么直接水平向右移动是最优的。

对于一般情况,我们可以分两步走:

  1. 先沿着x轴正方向移动到点(r,0),其中r是目标点到原点的距离
  2. 然后沿着半径为r的圆弧移动到目标点

目标点(233,666)到原点的距离为:
r = √(233² + 666²) = √(54289 + 443556) = √497845 ≈ 705.58

第一步移动距离为r = 705.58
第二步需要计算圆弧长度。目标点与x轴正方向的夹角θ满足:sinθ = 666 / r;

圆弧长度 = r·θ = 705.58 × arcsin(666.0 / r) ≈ 870.867

总移动距离 = 705.58 + 869.49 ≈ 1576

#include <bits/stdc++.h>
using namespace std; 
int main() {
  double r = sqrt(233 * 233 + 666 * 666);
  int ans = r + asin(666.0 / r) * r;
  cout << ans;
}

四舍五入到整数为1576。

答案

1576

试题C: 可分解的正整数

问题描述

定义一种特殊的整数序列,这种序列由连续递增的整数组成,并满足以下条件:

  1. 序列长度至少为3。
  2. 序列中的数字是连续递增的整数(即相邻元素之差为1),可以包括正整数、负整数或0。

例如,[1,2,3]、[4,5,6,7]和[-1,0,1]是符合条件的序列,而[1,2](长度不足)和[1,2,4](不连续)不符合要求。

现给定一组包含N个正整数的数据A₁,A₂,…,A_N。如果某个A_i能够表示为符合上述条件的连续整数序列中所有元素的和,则称A_i是可分解的。请你统计这组数据中可分解的正整数的数量。

解题思路

代码实现

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	int t;
	int ans = 0;
	cin>>n;
	for(int i = 0;i < n;i++){
		cin>>t;
		if(t != 1){
			ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

试题D: 产值调整

问题描述

偏远的小镇上,三兄弟共同经营着一家小型矿业公司"兄弟矿业"。公司旗下有三座矿山:金矿、银矿和铜矿,它们的初始产值分别用非负整数A、B和C表示。

为了稳定经营,三兄弟设计了一个产值调整策略,每年执行一次,每次调整时,将根据当前的产值A、B、C,计算新产值:

  1. 金矿新产值A′=⌊(B+C)/2⌋;
  2. 银矿新产值B′=⌊(A+C)/2⌋;
  3. 铜矿新产值C′=⌊(A+B)/2⌋。

其中,⌊⌋表示向下取整。计算出A′、B′、C′后,同时更新:A变为A′,B变为B′,C变为C′,作为下一年调整的基础。

三兄弟计划连续执行K次调整。现在,请你帮他们计算,经过K次调整后,金矿、银矿和铜矿的产值分别是多少。

解题思路

我们可以直接模拟这个过程,但由于K可能很大(最大10^9),直接模拟会超时。

观察调整规则,我们可以发现:

  1. 如果A=B=C,那么调整后仍然是A=B=C
  2. 如果不相等,每次调整后的值会趋向于平均值

实际上,经过足够多次调整后,三个值会变得相等或者在一个很小的范围内循环。

通过数学分析和实验,我们可以发现:

  1. 如果初始值全部相等,那么调整后仍然相等
  2. 如果不全相等,经过最多6次调整,三个值要么全部相等,要么会进入一个长度不超过3的循环

因此,我们可以先模拟前几次调整,然后根据情况决定最终结果。

代码实现

#include <bits/stdc++.h>
using namespace std;

void adjust(long long& a, long long& b, long long& c) {
	long long new_a = (b + c) / 2;
	long long new_b = (a + c) / 2;
	long long new_c = (a + b) / 2;
	a = new_a;
	b = new_b;
	c = new_c;
}

int main() {
	int T;
	cin >> T;
	
	while (T--) {
		long long A, B, C, K;
		cin >> A >> B >> C >> K;
		
		// 如果已经相等,不需要调整
		if (A == B && B == C) {
			cout << A << " " << B << " " << C << endl;
			continue;
		}
		while(K--){
			adjust(A,B,C);
			// 如果已经相等,不需要调整
			if (A == B && B == C) {
				break;
			}
		}
		
		cout << A << " " << B << " " << C << endl;
	}
	
	return 0;
}

对于样例输入:

  1. A=10, B=20, C=30, K=1

  2. 一次调整后:A′=25, B′=20, C′=15

  3. A=5, B=5, C=5, K=3

  4. 初始值已经相等,调整后仍然是A=5, B=5, C=5

试题E: 画展布置

问题描述

画展策展人小蓝和助理小桥为即将举办的画展准备了N幅画作,其艺术价值分别为A₁,A₂,…,A_N。他们需要从这N幅画中挑选M幅,并按照一定顺序布置在展厅的M个位置上。

为了优化布置,他们希望使艺术价值的变化程度通过一个数值L来衡量,且该值越小越好。数值L的定义为:
L = Σ(i=1 to M-1) |B²ᵢ₊₁ - B²ᵢ|

其中B_i表示展厅第i个位置上画作的艺术价值。

现在,他们希望通过精心挑选和排列这M幅画作,使L达到最小值。请你帮他们计算出这个最小值是多少。

解题思路

这个问题要求我们从N幅画中选择M幅,并排列它们,使得相邻画作艺术价值平方的差的绝对值之和最小。

首先,我们可以观察到,对于任意两幅画的艺术价值a和b,|a² - b²| = |a-b|·|a+b|。这意味着,如果我们想要最小化|a² - b²|,我们应该选择艺术价值接近的画作放在相邻位置。

一个直观的策略是:

  1. 对所有画作的艺术价值进行排序
  2. 选择M幅连续的画作(因为连续的画作艺术价值差异最小)
  3. 按照特定顺序排列这M幅画作,使得L最小

对于排列顺序,我们可以证明,最优的排列方式是按照艺术价值从小到大或从大到小排列。

代码实现

#include <bits/stdc++.h>
using namespace std;

int main() {
	int N, M;
	cin >> N >> M;
	
	vector<int> values(N);
	for (int i = 0; i < N; i++) {
		cin >> values[i];
	}
	
	// 排序
	sort(values.begin(), values.end());
	
	// 计算所有可能的连续M幅画作的L值
	long long min_L = LLONG_MAX;
	
	for (int i = 0; i <= N - M; i++) {
		vector<int> selected(values.begin() + i, values.begin() + i + M);
		
		// 计算按照从小到大排列的L值
		long long L1 = 0;
		for (int j = 0; j < M - 1; j++) {
			long long diff = (long long)selected[j+1] * selected[j+1] - (long long)selected[j] * selected[j];
			L1 += abs(diff);
		}
		
		// 计算按照从大到小排列的L值
		long long L2 = 0;
		for (int j = 0; j < M - 1; j++) {
			long long diff = (long long)selected[M-j-2] * selected[M-j-2] - (long long)selected[M-j-1] * selected[M-j-1];
			L2 += abs(diff);
		}
		
		min_L = min(min_L, min(L1, L2));
	}
	
	cout << min_L << endl;
	return 0;
}

对于样例输入:
N=4, M=2, 艺术价值为[1, 5, 2, 4]

排序后为[1, 2, 4, 5]
可能的连续2幅画作为:[1,2], [2,4], [4,5]

计算L值:

  • [1,2]: |2² - 1²| = |4 - 1| = 3
  • [2,4]: |4² - 2²| = |16 - 4| = 12
  • [4,5]: |5² - 4²| = |25 - 16| = 9

最小的L值为3。

试题F: 水质检测

问题描述

小明需要在一条2×n的河床上铺设水质检测器。在他铺设之前,河床上已经存在一些检测器。如果两个检测器上下或者左右相邻,那么这两个检测器就是互相连通的。连通具有传递性,即如果A和B连通,B和C连通,那么A和C也连通。现在他需要在河床上增加铺设一些检测器使得所有的检测器都互相连通。他想知道最少需要增加铺设多少个检测器?

解题思路

题目要求在一个2×n的河床上增加最少的检测器,使得所有检测器互相连通。河床用一个2×n的字符矩阵表示,其中’#‘表示已有检测器,’.'表示空白位置。如果两个检测器上下或左右相邻,则它们互相连通,且连通具有传递性。

这道题目可以使用动态规划来解决。我们需要考虑如何让所有检测器连通,并且使新增的检测器数量最少。

状态定义

我们定义状态dp[i][j]表示:当处理到第i列,且第i列的第j行为’#'(无论是原有的还是新放置的),并且前i列的所有检测器都连通时,需要新增的最少检测器数量。

其中:

  • i表示列号,范围是[st, en],st是最左边有检测器的列,en是最右边有检测器的列
  • j表示行号,取值为0或1,分别表示第一行和第二行

状态转移

对于位置(i,j),我们有两种可能的转移来源:

  1. 从(i-1,j)转移:即上一列同一行的位置
  2. 从(i-1,1-j)转移:即上一列不同行的位置,但这需要通过当前列的另一行(i,1-j)连接

下面用图示来说明状态转移:

列i-1    列i
  □ ---- □  (行0)
  |      |
  □ ---- □  (行1)

假设我们当前要计算dp[i][0](即列i 行0的状态):

  1. dp[i-1][0]转移:
列i-1    列i
  # ---- #  (行0)
  |      |
  □      □  (行1)
  • 如果(i,0)是’#‘,且(i-1,0)也是’#',它们自然连通。
  • 如果(i,0)不是’#',需要放置一个检测器,花费+1。
  1. dp[i-1][1]转移:
列i-1    列i
  □      #  (行0)
  |      |
  # ---- □  (行1)
  • 如果(i,0)是’#‘,且(i-1,1)也是’#‘,要与(i,0)连通,需要通过(i,1),当(i,1)不是’#'时,就需要放置一个检测器,故花费+(s[i][1] == ‘#’ ? 0 : 1)。
  • 如果(i,0)不是’#',那么(i,0)需要放置一个检测器,花费+(s[i][0] == ‘#’ ? 0 : 1)。

状态转移方程如下:

  • 如果s[i][j]已经是’#'(已有检测器):
dp[i][j] = min(dp[i-1][j], dp[i-1][1-j] + (s[i][1-j]=='#'?0:1))
  • 如果s[i][j]是’.'(需要放置检测器):
dp[i][j] = min(dp[i-1][j], dp[i-1][1-j] + (s[i][1-j]=='#'?0:1)) + 1

边界条件

对于起始位置st(最左边有检测器的位置):

  • 如果s[st][0]是’#',则dp[st][0]=0
  • 如果s[st][0]是’.',则dp[st][0]=1(需要放置一个检测器)
  • 同理处理dp[st][1]

如果起始位置两行都有检测器,需要确保它们连通,此时dp[st][0]=dp[st][1]=0。

最终结果

最终答案是min(dp[en][0], dp[en][1]),表示在最右边有检测器的位置en,使得所有检测器连通的最小花费。

代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+30;

char s[N][2];
int dp[N][2]; // dp[i][j]表示当前第i列第j行为'#'且与前面的检测器连通时的最小花费

void way(){
    string t;
    int n;
    // 数据输入
    for(int j=0;j<2;j++){
        cin>>t;// 读入一个字符串
        n = t.size();
        for(int i=1;i<=n;i++)s[i][j] = t[i-1];
    }

    int st = n+1,en = 0; // 找到左右两边的起始位置(最左边有检测器的位置)和(最右边有检测器的位置)。
    for(int i=1;i<=n;i++){
        if(s[i][0]=='#'||s[i][1]=='#'){
            st = min(i,st);
            en = max(en,i);
        }
    }
    
    // 初始化dp数组
    memset(dp, 0x3f, sizeof(dp)); // 初始化为一个很大的值
    
    // 处理起始位置
    if(s[st][0]=='#') dp[st][0]=0; // 如果已经有检测器,花费为0
    else dp[st][0]=1; // 否则需要放置一个检测器,花费为1
    
    if(s[st][1]=='#') dp[st][1]=0; // 如果已经有检测器,花费为0
    else dp[st][1]=1; // 否则需要放置一个检测器,花费为1
    
    // 如果起始位置两行都有检测器,需要确保它们连通
    if(s[st][0]=='#' && s[st][1]=='#') {
        dp[st][0] = dp[st][1] = 0; // 两个位置都已有检测器,花费为0
    }
    
    for(int i=st+1;i<=en;i++){
        // 计算dp[i][0]
        if(s[i][0]=='#') { // 如果当前位置已有检测器
            // 从上一列转移
            dp[i][0] = min(dp[i-1][0], dp[i-1][1] + (s[i][1]=='#'?0:1));
        } else { // 如果当前位置需要放置检测器
            dp[i][0] = min(dp[i-1][0], dp[i-1][1] + (s[i][1]=='#'?0:1)) + 1;
        }
        
        // 计算dp[i][1]
        if(s[i][1]=='#') { // 如果当前位置已有检测器
            // 从上一列转移
            dp[i][1] = min(dp[i-1][1], dp[i-1][0] + (s[i][0]=='#'?0:1));
        } else { // 如果当前位置需要放置检测器
            dp[i][1] = min(dp[i-1][1], dp[i-1][0] + (s[i][0]=='#'?0:1)) + 1;
        }
    }
    
    cout<<min(dp[en][0],dp[en][1])<<endl;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    way();
    return 0;
}

示例分析

让我们以样例为例,详细分析算法的执行过程:

输入:

.##.....#
.#.#.#...

我们可以将其表示为一个2×9的矩阵(为了方便,列号从1开始):

列号: 1 2 3 4 5 6 7 8 9
行0:  . # # . . . . . #
行1:  . # . # . # . . .

1. 确定计算范围

首先找到st=2(最左边有检测器的位置)和en=9(最右边有检测器的位置)。

2. 初始化dp数组

初始化dp数组为一个很大的值(表示无法到达的状态)。

对于起始位置st=2:

  • s[2] [0]=‘#’,所以dp[2] [0]=0(已有检测器,不需要额外花费)
  • s[2] [1]=‘#’,所以dp[2] [1]=0(已有检测器,不需要额外花费)

由于第2列的两行都有检测器,它们已经连通,所以dp[2] [0]=dp[2] [1]=0。

3. 逐列计算dp值

对于i=3(第3列):

计算dp[3] [0]:

  • s[3] [0]=‘#’(已有检测器)
    • 从dp[2] [0]转移:dp[2] [0]=0
    • 从dp[2] [1]转移:dp[2] [1]=0,但需要通过(3,1)连接,s[3] [1]=‘.’,需要额外放置一个检测器,所以花费为0+1=1
  • 取最小值:dp[3] [0]=min(0,1)=0

计算dp[3] [1]:

  • s[3] [1]=‘.’(需要放置检测器)
    • 从dp[2] [1]转移:dp[2] [1]=0
    • 从dp[2] [0]转移:dp[2] [0]=0,但需要通过(3,0)连接,s[3] [0]=‘#’,不需要额外放置检测器,所以花费为0+0=0
  • 由于(3,1)需要放置检测器,额外花费1,所以dp[3] [1]=min(0,0)+1=1

对于i=4(第4列):

计算dp[4] [0]:

  • s[4] [0]=‘.’(需要放置检测器)
    • 从dp[3] [0]转移:dp[3] [0]=0
    • 从dp[3] [1]转移:dp[3] [1]=1,但需要通过(4,1)连接,s[4] [1]=‘#’,不需要额外放置检测器,所以花费为1+0=1
  • 由于(4,0)需要放置检测器,额外花费1,所以dp[4] [0]=min(0,1)+1=1

计算dp[4] [1]:

  • s[4] [1]=‘#’(已有检测器)
    • 从dp[3] [1]转移:dp[3] [1]=1
    • 从dp[3] [0]转移:dp[3] [0]=0,但需要通过(4,0)连接,s[4] [0]=‘.’,需要额外放置一个检测器,所以花费为0+1=1
  • 取最小值:dp[4] [1]=min(1,1)=1

对于i=5(第5列):

计算dp[5] [0]:

  • s[5] [0]=‘.’(需要放置检测器)
    • 从dp[4] [0]转移:dp[4] [0]=1
    • 从dp[4] [1]转移:dp[4] [1]=1,但需要通过(5,1)连接,s[5] [1]=‘.’,需要额外放置一个检测器,所以花费为1+1=2
  • 由于(5,0)需要放置检测器,额外花费1,所以dp[5] [0]=min(1,2)+1=2

计算dp[5] [1]:

  • s[5] [1]=‘.’(需要放置检测器)
    • 从dp[4] [1]转移:dp[4] [1]=1
    • 从dp[4] [0]转移:dp[4] [0]=1,但需要通过(5,0)连接,s[5] [0]=‘.’,需要额外放置一个检测器,所以花费为1+1=2
  • 由于(5,1)需要放置检测器,额外花费1,所以dp[5] [1]=min(1,2)+1=2

对于i=6(第6列):

计算dp[6] [0]:

  • s[6] [0]=‘.’(需要放置检测器)
    • 从dp[5] [0]转移:dp[5] [0]=2
    • 从dp[5] [1]转移:dp[5] [1]=2,但需要通过(6,1)连接,s[6] [1]=‘#’,不需要额外放置检测器,所以花费为2+0=2
  • 由于(6,0)需要放置检测器,额外花费1,所以dp[6] [0]=min(2,2)+1=3

计算dp[6] [1]:

  • s[6] [1]=‘#’(已有检测器)
    • 从dp[5] [1]转移:dp[5] [1]=2
    • 从dp[5] [0]转移:dp[5] [0]=2,但需要通过(6,0)连接,s[6] [0]=‘.’,需要额外放置一个检测器,所以花费为2+1=3
  • 取最小值:dp[6] [1]=min(2,3)=2

对于i=7(第7列):

计算dp[7] [0]:

  • s[7] [0]=‘.’(需要放置检测器)
    • 从dp[6] [0]转移:dp[6] [0]=3
    • 从dp[6] [1]转移:dp[6] [1]=2,但需要通过(7,1)连接,s[7] [1]=‘.’,需要额外放置一个检测器,所以花费为2+1=3
  • 由于(7,0)需要放置检测器,额外花费1,所以dp[7] [0]=min(3,3)+1=4

计算dp[7] [1]:

  • s[7] [1]=‘.’(需要放置检测器)
    • 从dp[6] [1]转移:dp[6] [1]=2
    • 从dp[6] [0]转移:dp[6] [0]=3,但需要通过(7,0)连接,s[7] [0]=‘.’,需要额外放置一个检测器,所以花费为3+1=4
  • 由于(7,1)需要放置检测器,额外花费1,所以dp[7] [1]=min(2,4)+1=3

对于i=8(第8列):

计算dp[8] [0]:

  • s[8] [0]=‘.’(需要放置检测器)
    • 从dp[7] [0]转移:dp[7] [0]=4
    • 从dp[7] [1]转移:dp[7 ] [1]=3,但需要通过(8,1)连接,s[8] [1]=‘.’,需要额外放置一个检测器,所以花费为3+1=4
  • 由于(8,0)需要放置检测器,额外花费1,所以dp[8] [0]=min(4,4)+1=5

计算dp[8] [1]:

  • s[8] [1]=‘.’(需要放置检测器)
    • 从dp[7] [1]转移:dp[7] [1]=3
    • 从dp[7] [0]转移:dp[7] [0]=4,但需要通过(8,0)连接,s[8] [0]=‘.’,需要额外放置一个检测器,所以花费为4+1=5
  • 由于(8,1)需要放置检测器,额外花费1,所以dp[8] [1]=min(3,5)+1=4

对于i=9(第9列):

计算dp[9] [0]:

  • s[9] [0]=‘#’(已有检测器)
    • 从dp[8] [0]转移:dp[8] [0]=5
    • 从dp[8] [1]转移:dp[8] [1]=4,但需要通过(9,1)连接,s[9] [1]=‘.’,需要额外放置一个检测器,所以花费为4+1=5
  • 取最小值:dp[9] [0]=min(5,5)=5

计算dp[9] [1]:

  • s[9] [1]=‘.’(需要放置检测器)
    • 从dp[8] [1]转移:dp[8] [1]=4
    • 从dp[8] [0]转移:dp[8] [0]=5,但需要通过(9,0)连接,s[9] [0]=‘#’,不需要额外放置检测器,所以花费为5+0=5
  • 由于(9,1)需要放置检测器,额外花费1,所以dp[9] [1]=min(4,5)+1=5

4. 计算最终结果

最终答案是min(dp[9] [0], dp[9] [1])=min(5, 5)=5,表示需要增加5个检测器使所有检测器连通。

可视化最终方案

一种可能的最终方案('+'表示新增的检测器):

列号: 1 2 3 4 5 6 7 8 9
行0:  . # # + + . . . #
行1:  . # . # . # + + .

或者:

列号: 1 2 3 4 5 6 7 8 9
行0:  . # # . . . . + #
行1:  . # + # + # + + .

这两种方案都需要增加5个检测器,使所有检测器连通。

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

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

相关文章

计算机网络应用层(5)-- P2P文件分发视频流和内容分发网

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f493;本博客内容为《计算机网络&#xff1a;自顶向下方法》第二章应用层第五、六节知识梳理 关注我&…

Gin优雅关闭 graceful-shutdown

文章目录 优雅关闭示例 - Close 方法项目结构使用方法代码如下代码说明如果去掉代码中的数字1&#xff0c;会发生什么 优雅关闭示例项目结构使用方法使用上下文通知不使用上下文通知 代码 notify-without-context-server.go代码说明 代码 notify-with-context-server.go代码说明…

五子棋html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戏</title> <style>bo…

JavaWeb:后端web基础(TomcatServletHTTP)

一、今日内容 二、Tomcat 介绍与使用 介绍 基本使用 小结 配置 配置 查找进程 三、Servlet 什么是Servlet 快速入门 需求 步骤 1.新建工程-模块&#xff08;Maven&#xff09; 2.修改打包方式-war 3.编写代码 /*** 可以选择继承HttpServlet*/ WebServlet("/hello&q…

缓存(1):三级缓存

三级缓存是指什么 我们常说的三级缓存如下&#xff1a; CPU三级缓存Spring三级缓存应用架构&#xff08;JVM、分布式缓存、db&#xff09;三级缓存 CPU 基本概念 CPU 的访问速度每 18 个月就会翻 倍&#xff0c;相当于每年增⻓ 60% 左右&#xff0c;内存的速度当然也会不断…

Cursor —— AI编辑器 使用详解

Cursor - The AI Code Editor 一、Cursor 是什么&#xff1f; Cursor 是一款优秀的AI代码编辑器&#xff0c;它内置了 Deepseek-R1、GPT-4、Claude等 AI 模型。 简单说&#xff0c;就是&#xff1a;Cursor VS Code 编辑器 AI 大模型 Cursor 功能特性&#xff08;代码补全、…

Pytorch-CUDA版本环境配置

Pytorch-CUDA版本环境配置 电脑如果是Windows平台下的Nvidia GPU的用户&#xff0c;需配置Pytorch的CUDA版本&#xff0c;分为三步&#xff1a; 1. 安装或更新NVIDA显卡驱动 官方驱动下载地址&#xff1a; https://www.nvidia.cn/Download/index.aspx?langcn 2. 安装CUDA Too…

OpenCV 图形API(77)图像与通道拼接函数-----对图像进行几何变换函数remap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用一个通用的几何变换。 函数 remap 使用指定的映射对源图像进行变换&#xff1a; dst ( x , y ) src ( m a p x ( x , y ) , m a p y…

Spring AI 入门(持续更新)

介绍 Spring AI 是 Spring 项目中一个面向 AI 应用的模块&#xff0c;旨在通过集成开源框架、提供标准化的工具和便捷的开发体验&#xff0c;加速 AI 应用程序的构建和部署。 依赖 <!-- 基于 WebFlux 的响应式 SSE 传输 --> <dependency><groupId>org.spr…

QUIC协议优化:HTTP_3环境下的超高速异步抓取方案

摘要 随着 QUIC 和 HTTP/3 的普及&#xff0c;基于 UDP 的连接复用与内置加密带来了远超 HTTP/2 的性能提升&#xff0c;可显著降低连接握手与拥塞恢复的开销。本文以爬取知乎热榜数据为目标&#xff0c;提出一种基于 HTTPX aioquic 的异步抓取方案&#xff0c;并结合代理 IP设…

uni-app实现完成任务解锁拼图功能

界面如下 代码如下 <template><view class"puzzle-container"><view class"puzzle-title">任务进度 {{completedCount}}/{{totalPieces}}</view><view class"puzzle-grid"><viewv-for"(piece, index) in…

数据链路层(MAC 地址)

目录 一、前言&#xff1a; 二、以太网&#xff1a; 三、MAC 地址的作用&#xff1a; 四、ARP协议&#xff1a; 一、前言&#xff1a; 数据链路层主要负责相邻两个节点之间的数据传输&#xff0c;其中&#xff0c;最常见数据链路层的协议有 以太网&#xff08;通过光纤 / 网…

基于DQN的自动驾驶小车绕圈任务

1.任务介绍 任务来源: DQN: Deep Q Learning &#xff5c;自动驾驶入门&#xff08;&#xff1f;&#xff09; &#xff5c;算法与实现 任务原始代码: self-driving car 最终效果&#xff1a; 以下所有内容&#xff0c;都是对上面DQN代码的改进&#…

【Linux】Linux工具(1)

3.Linux工具&#xff08;1&#xff09; 文章目录 3.Linux工具&#xff08;1&#xff09;Linux 软件包管理器 yum什么是软件包关于 rzsz查看软件包——yum list命令如何安装软件如何卸载软件补充——yum如何找到要安装软件的下载地址 Linux开发工具Linux编辑器-vim使用1.vim的基…

基于 Spring Boot 瑞吉外卖系统开发(十一)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十一&#xff09; 菜品启售和停售 “批量启售”、“批量停售”、操作列的售卖状态绑定单击事件&#xff0c;触发单击事件时&#xff0c;最终携带需要修改售卖状态的菜品id以post请求方式向“/dish/status/{params.status}”发送…

深入理解负载均衡:传输层与应用层的原理与实战

目录 前言1. 传输层&#xff08;Layer 4&#xff09;负载均衡1.1 工作层级与核心机制1.2 实现方式详解1.3 优缺点分析1.4 典型实现工具 2. 应用层&#xff08;Layer 7&#xff09;负载均衡2.1 工作层级与核心机制2.2 实现方式解析2.3 优缺点分析2.4 常用实现工具 3. Layer 4 与…

WPF之Slider控件详解

文章目录 1. 概述2. 基本属性2.1 值范围属性2.2 滑动步长属性2.3 刻度显示属性2.4 方向属性2.5 选择范围属性 3. 事件处理3.1 值变化事件3.2 滑块拖动事件 4. 样式和模板自定义4.1 基本样式设置4.2 控件模板自定义 5. 数据绑定5.1 绑定到ViewModel5.2 同步多个控件 6. 实际应用…

企业微信自建消息推送应用

企业微信自建应用来推送消息 前言 最近有个给特定部门推送消息的需求&#xff0c;所以配置一个应用专门用来推送消息。实现过程大致为&#xff1a;服务器生成每天的报告&#xff0c;通过调用API来发送消息。以前一直都是发邮件&#xff0c;整个邮箱里全是报告文件&#xff0c…

日志之ClickHouse部署及替换ELK中的Elasticsearch

文章目录 1 ELK替换1.1 Elasticsearch vs ClickHouse1.2 环境部署1.2.1 zookeeper 集群部署1.2.2 Kafka 集群部署1.2.3 FileBeat 部署1.2.4 clickhouse 部署1.2.4.1 准备步骤1.2.4.2 添加官方存储库1.2.4.3 部署&启动&连接1.2.4.5 基本配置服务1.2.4.6 测试创建数据库和…

解构与重构:自动化测试框架的进阶认知之旅

目录 一、自动化测试的介绍 &#xff08;一&#xff09;自动化测试的起源与发展 &#xff08;二&#xff09;自动化测试的定义与目标 &#xff08;三&#xff09;自动化测试的适用场景 二、什么是自动化测试框架 &#xff08;一&#xff09;自动化测试框架的定义 &#x…