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

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢,结果一不小心刷成国赛了
真是个小迷糊〒▽〒
但,又如何( •̀ ω •́ )✧
记录刷题的过程、感悟、题解。
希望能帮到,那些与我一同前行的,来自远方的朋友😉


大纲:

一、子2023-(题解)-递推or动态规划

二、双子数-(题解)-筛法、类型(unsigned long long)😥

三、班级活动-(题解)-不出所料、贪心+计数

四、合并数列-(题解)-妥妥的前缀和😥,当然双指针也能做

五、数三角-(题解)-这个真的就是算术题了,还要用到各种优化(叉乘、用半径分组)

六、删边问题-(题解)-图(tarjan算法)割边、割点,经典板子题

七、AB路线-(题解)-BFS广搜,最短路径、记忆话搜索😉

八、抓娃娃-(题解)-简单点的差分+前缀和😊

九、十,等后续冲击国赛时,再解决。


一、子2023

问题描述

小蓝在黑板上连续写下从 11 到 20232023 之间所有的整数,得到了一个数字序列: S=12345678910111213...20222023S=12345678910111213...20222023。 小蓝想知道 SS 中有多少种子序列恰好等于 20232023?

以下是 33 种满足条件的子序列(用中括号标识出的数字是子序列包含的数字):

1[2]34567891[0]111[2]1[3]14151617181920212223...
1[2]34567891[0]111[2]1[3]14151617181920212223...
1[2]34567891[0]111[2]131415161718192021222[3]...
1[2]34567891[0]111[2]131415161718192021222[3]...
1[2]34567891[0]111213141516171819[2]021222[3]...
1[2]34567891[0]111213141516171819[2]021222[3]...

注意以下是不满足条件的子序列,虽然包含了 22、00、22、33 四个数字,但是顺序不对:

1[2]345678910111[2]131415161718192[0]21222[3]...
1[2]345678910111[2]131415161718192[0]21222[3]...

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

动态规划解法:

本题解法,说成是状态规划,可能会引起恐惧,其实它就是一道简单的状态推导题( •̀ ω •́ )✧

C++
#include <iostream>
#include <vector>
using namespace std;
// 是个简单的动态规划就算了
// 怎么又是一道越界题目
// 以后统一不用long long改用 unsigned long long。更大。
int main(){vector<unsigned long long> dp(4,0);string str="";for(int i=1; i<=2023; ++i) str+=to_string(i);// 本题的解法是动态规划for(char c : str){if(c=='2'){dp[0]++;dp[2]+=dp[1];}if(c=='0') dp[1]+=dp[0];if(c=='3') dp[3]+=dp[2];}cout<<dp[3]<<endl;return 0;
}
Java
public class DpProblem {public static void main(String[] args) {// 创建一个长度为 4 的 long 类型数组 dp 并初始化为 0long[] dp = new long[4];// 拼接字符串StringBuilder str = new StringBuilder();for (int i = 1; i <= 2023; i++) {str.append(i);}// 动态规划过程for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if (c == '2') {dp[0]++;dp[2] += dp[1];}if (c == '0') {dp[1] += dp[0];}if (c == '3') {dp[3] += dp[2];}}// 输出结果System.out.println(dp[3]);}
}    

二、双子数

问题描述

若一个正整数 xx 可以被表示为 p2×q2p2×q2,其中 pp、qq 为质数且 p≠qp=q,则 xx 是一个双子数。请计算区间 [2333,‭23333333333333‬][2333,‭23333333333333‬] 内有多少个双子数

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

// 我本以为,本题最难的是欧拉筛,也就是线性筛
// 后来我发现,我错了,而且错的离谱
// 欧拉筛,能用埃氏筛代替,能用朴素也就是暴力法代替。
// 而本题最大的难点是符号位,如果你开到(long long),答案会始终多10,让你痛不欲生。
// 本题要开到,unsigned long long
// int->1e9 , long long->1e18, unsigned long long是longlong的两倍

// 切记,不会欧拉筛的,可以用线性筛代替,或者直接暴力(会慢一些):: 四种筛法 ::

C++
#include <iostream>
#include <vector>
#define ll long long
using namespace std;const int N =  1e7 + 10;
vector<bool> vec(N, true); // 假设都是质数
vector<ll> res;
void sieve(){ // 欧拉筛vec[0]=vec[1]= false;for(int i=2; i<vec.size(); ++i){if(vec[i]) res.push_back((ll)i);for(ll num:res){if(num*i>vec.size()) break; // 超出最大范围vec[i*num] = false;if(i%num==0) break; // 确保每个合数,只被最小因子除去。}}
}
//天呐,你要这样玩?还咋玩??
int main(){sieve();ll num = 0;for(ll i=0;i<res.size();i++){unsigned ll pp = res[i]*res[i];if(pp * pp >23333333333333) break;//一点小优化for(ll j=i+1;j<res.size();j++){ll qq = res[j]*res[j];if(pp*qq>23333333333333) break;if(pp*qq<2333) continue;num++;}}cout<<num<<endl;return 0;
}
Java
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;public class PrimeNumberCombination {// 定义常量 N,用于筛法范围static final int N = 10000010;// 标记每个数是否为质数的布尔数组static boolean[] isPrime = new boolean[N];// 存储质数的列表static List<Integer> primes = new ArrayList<>();// 欧拉筛函数,筛选出所有质数public static void sieve() {// 初始化所有数为质数for (int i = 0; i < N; i++) {isPrime[i] = true;}// 0 和 1 不是质数isPrime[0] = isPrime[1] = false;for (int i = 2; i < N; i++) {if (isPrime[i]) {primes.add(i);}for (int prime : primes) {if (prime * i >= N) {break;}isPrime[prime * i] = false;if (i % prime == 0) {break;}}}}public static void main(String[] args) {// 调用欧拉筛函数sieve();BigInteger limit1 = BigInteger.valueOf(23333333333333L);BigInteger limit2 = BigInteger.valueOf(2333L);long num = 0;for (int i = 0; i < primes.size(); i++) {BigInteger pp = BigInteger.valueOf(primes.get(i)).pow(2);if (pp.pow(2).compareTo(limit1) > 0) {break;}for (int j = i + 1; j < primes.size(); j++) {BigInteger qq = BigInteger.valueOf(primes.get(j)).pow(2);BigInteger product = pp.multiply(qq);if (product.compareTo(limit1) > 0) {break;}if (product.compareTo(limit2) < 0) {continue;}num++;}}// 输出满足条件的组合数量System.out.println(num);}
}    

三、班级活动

问题描述

小明的老师准备组织一次班级活动。班上一共有 nn 名 (nn 为偶数) 同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 nn 以内的正整数作为 idid,第 ii 名同学的 idid 为 aiai​。

老师希望通过更改若干名同学的 idid 使得对于任意一名同学 ii,有且仅有另一名同学 jj 的 idid 与其相同 (ai=ajai​=aj​)。请问老师最少需要更改多少名同学的 idid?

输入格式

输入共 22 行。

第一行为一个正整数 nn。

第二行为 nn 个由空格隔开的整数 a1,a2,...,ana1​,a2​,...,an​。

输出格式

输出共 11 行,一个整数。

样例输入

4
1 2 2 3

样例输出

1

样例说明

仅需要把 a1a1​ 改为 33 或者把 a3a3​ 改为 11 即可。

评测用例规模与约定

对于 20%20% 的数据,保证 n≤103n≤103。

对于 100%100% 的数据,保证 n≤105n≤105

// ⚆_⚆?当我找到哪里错了之后,泪流满面
// 本题其实挺简单
// 读题:“每名同学,随机分配n以内的正整数作为id” 
// 这说明,每个同学的id有两种情况。
// 此时举一个简单的例子就OK了
// 像题目中举得例子,1 2 2 3 一组(2,2)就能配对,仅需更改3变成1(1->3也行)就OK了,只需一次。
// 推算成公式,也就是 2/1=1 -> 散列的总数/2
// 进阶一点,当id为 2 2 2 1时,此时一组(2,2)就能配对,这时仅需更改剩下的2变成1就OK了,也只需要更改一次。
// 如果是 2 2 2 2 2 1 呢,要先去掉一组(2,2)
// 此时剩下 2 2 2 1,因为不能与已经配对的(2,2)重复,
// 所以先把其中一个2改为1,需要一次。
// 此时剩下 2 2,只需将它们改成其他数就行,如改成(3,3),需要两次。
// 一共用了3次,也就是2的总数 减去2 也就是减去(2,2)这个不需要改变的组合。
// 也就是 当已被占用的id的数量,大于未被占用id时,总数等于 重复 id的数量。

C++
#include <iostream>
const int N = 1e5+5;
using namespace std;
int arr[N]; int main()
{int n;cin>>n;for(int i=0; i<n; ++i){int num;cin>>num;arr[num]++;}int num1=0, num2=0;for(int i : arr){if(i>2) num1 += i-2; // 求取数量相同的数在减2;else if(i==1) num2++;}int sum = 0;// 当已被占用的id的数量,大于未被占用id时,那么sum = num1;if(num1>num2){sum = num1;  }else{ // num2<num1的情况sum = num2 + (num1-num2)/2;}cout<<sum<<endl;return 0;
}
Java
import java.util.Scanner;public class StudentIdAdjustment {// 定义常量 N,用于数组大小static final int N = 100005;public static void main(String[] args) {// 创建 Scanner 对象用于读取输入Scanner scanner = new Scanner(System.in);// 定义一个数组来记录每个 ID 出现的次数int[] arr = new int[N];// 读取学生的数量int n = scanner.nextInt();// 循环读取每个学生的 ID,并统计每个 ID 出现的次数for (int i = 0; i < n; i++) {int num = scanner.nextInt();arr[num]++;}// 初始化两个变量,用于统计需要处理的不同情况的数量int num1 = 0;int num2 = 0;// 遍历数组,统计 num1 和 num2 的值for (int i : arr) {// 如果某个 ID 出现的次数大于 2,计算超出 2 的部分并累加到 num1if (i > 2) {num1 += i - 2;} // 如果某个 ID 只出现了 1 次,将 num2 加 1else if (i == 1) {num2++;}}// 初始化最终结果变量int sum = 0;// 当 num1 大于 num2 时,说明已被占用的 ID 数量更多,sum 等于 num1if (num1 > num2) {sum = num1;} // 当 num2 大于等于 num1 时,按照相应规则计算 sumelse {sum = num2 + (num1 - num2) / 2;}// 输出最终结果System.out.println(sum);// 关闭 Scanner 对象,释放资源scanner.close();}
}    

四、合并数列

问题描述

小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案,分别将他们列为两个数组 {a1,a2,...,an}{a1​,a2​,...,an​} 和 {b1,b2,...,bm}{b1​,b2​,...,bm​}。两个数组的和相同。

定义一次合并操作可以将某数组内相邻的两个数合并为一个新数,新数的值是原来两个数的和。小明想通过若干次合并操作将两个数组变成一模一样,即 n=mn=m 且对于任意下标 ii 满足 ai=biai​=bi​。请计算至少需要多少次合并操作可以完成小明的目标。

输入格式

输入共 33 行。

第一行为两个正整数 nn, mm。

第二行为 nn 个由空格隔开的整数 a1,a2,...,ana1​,a2​,...,an​。

第三行为 mm 个由空格隔开的整数 b1,b2,...,bmb1​,b2​,...,bm​。

输出格式

输出共 11 行,一个整数。

样例输入

4 3
1 2 3 4
1 5 4

样例输出

1

样例说明

只需要将 a2a2​ 和 a3a3​ 合并,数组 aa 变为 {1,5,4}{1,5,4},即和 bb 相同。

评测用例规模与约定

对于 20%20% 的数据,保证 nn, m≤103m≤103。

对于 100%100% 的数据,保证 nn, m≤105m≤105,0<ai0<ai​, bi≤105bi​≤105。

// 本题原意:“两个数列,通过不断合并相邻的两个数,使两个数列相同”
// 注意-“相邻” “合并(相加)”,也就意味着可能要使用前缀和。
// 用反向思维来看,两个数列最终是相同的。
// 也就意味着从俩数列,第一个数开始,就要是相同的。
// 我们只需要从头开始计算前缀和,如果相同时,代表俩数列第i位已经相同,
// 此时更新俩前缀和的计算起始位置即可。
// 所以本题是,双指针与前缀和的结合。

1 2 3 4
1 5 4
------------
对比两个数列的第一位,相同,不用变
------------
3 3 4
6 4
第一位不同,合并小的前两位
----------
6 4
6 4
....

// 本题又让我痛哭不已,类型开小了,本题最大有1e10左右,int不太行

C++
#include <iostream>
#include <vector>
using namespace std;int main()
{int n,m;cin>>n>>m;vector<int> a(n,0);vector<int> b(m,0);for(int i=0; i<n; ++i) cin>>a[i];for(int i=0; i<m; ++i) cin>>b[i];// sum_a a数列的前缀和// sum_b b数列的前缀和// cnt_a a的位数// cnt_b b的位数// cnt_sum 总共需要的次数long long sum_a=0,sum_b=0,cnt_a=0,cnt_b=0,cnt_sum=0;while(true){if(sum_a==sum_b){sum_a+=a[cnt_a++];sum_b+=b[cnt_b++];}else if(sum_a<sum_b){ // 第一个值小,需要合并sum_a+=a[cnt_a++];cnt_sum++;}else if(sum_b<sum_a){ // 第二个值小,需要合并sum_b+=b[cnt_b++];cnt_sum++;}if(cnt_a==n&&cnt_b==m) break;}cout<<cnt_sum;return 0;
}
Java
import java.util.Scanner;public class MergeArrays {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取两个数组的长度int n = scanner.nextInt();int m = scanner.nextInt();// 初始化两个数组int[] a = new int[n];int[] b = new int[m];// 读取第一个数组的元素for (int i = 0; i < n; i++) {a[i] = scanner.nextInt();}// 读取第二个数组的元素for (int i = 0; i < m; i++) {b[i] = scanner.nextInt();}// 初始化前缀和变量和指针long sum_a = 0, sum_b = 0; // 使用long避免大数溢出int cnt_a = 0, cnt_b = 0; // 数组a和b的当前指针位置int cnt_sum = 0; // 记录合并次数// 循环处理直到两个数组都遍历完毕while (true) {// 当两个前缀和相等时,移动到下一个元素if (sum_a == sum_b) {// 注意边界条件:避免数组越界if (cnt_a < n) {sum_a += a[cnt_a++]; // 移动a的指针并累加值}if (cnt_b < m) {sum_b += b[cnt_b++]; // 移动b的指针并累加值}} else if (sum_a < sum_b) {// a的前缀和较小,需要合并下一个元素sum_a += a[cnt_a++]; // 合并a的下一个元素cnt_sum++; // 合并次数加1} else {// b的前缀和较小,需要合并下一个元素sum_b += b[cnt_b++]; // 合并b的下一个元素cnt_sum++; // 合并次数加1}// 检查是否已经遍历完两个数组的所有元素if (cnt_a == n && cnt_b == m) {break;}}// 输出最终的合并次数System.out.println(cnt_sum);scanner.close();}
}

五、数三角

问题描述

小明在二维坐标系中放置了 nn 个点,他想在其中选出一个包含三个点的子集,这三个点能组成三角形。然而这样的方案太多了,他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形?

输入格式

输入共 n+1n+1 行。

第一行为一个正整数 nn。

后面 nn 行,每行两个整数 xixi​, yiyi​ 表示第 ii 个点的坐标。

输出格式

输出共 11 行,一个整数。

样例输入

5
1 1
4 1
1 0
2 1
1 2

样例输出

4

样例说明

一共有 44 种选法: {3,4,5}{3,4,5}、{1,3,4}{1,3,4}、{5,2,3}{5,2,3}、{1,4,5}{1,4,5}。

评测用例规模与约定

对于 20%20% 的数据,保证 n≤200n≤200。

对于 100%100% 的数据,保证 n≤2000n≤2000,0≤xi,yi≤1090≤xi​,yi​≤109。

/*
  本题要是直接3层暴力,肯定对,但是只能获取60%的分!
  所以要用上很多优化方式
  如:根据半径求解叉乘(在本文下方有讲解,也可上网搜)判是否三点在一条直线上
  通过vector<map<ll,vector<int>>> 预处理分组
  最后用unordered_map存储,O(1)

  其实最开始,我也是有疑问的,这是怎么将O(n^3)优化到接近O(n^2)
  毕竟预处理分组后下方仍有4层循环呢
  其实画个图就好了。
  没优化之前,每个节点都要判断(n^2)次,优化之后,每个节点仅需判断分组过后的就行(哪怕是4层,其实有效的点不多,可近似成线性)。
*/

 C++
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;#define ll long long // 因为不可能出现负数,直接开到最大(unsigned long long)
const ll N = 2e3+5;struct point{int x;int y;
}p[N]; // 定义节点-预处理ll get_radius(int i, int j){ // 半径的平方return (p[i].x-p[j].x)*(p[i].x-p[j].x) + (p[i].y-p[j].y)*(p[i].y-p[j].y);
}bool is_parallel(int i, int j, int k){ // 用叉乘的方法,快速判断,这一步不会的,可以上网查询叉乘的作用,以及用法。ll v = (p[j].x-p[i].x)*(p[k].y-p[i].y)-(p[j].y-p[i].y)*(p[k].x-p[i].x); // i-j(p[j].x-p[i].x),(p[j].y-p[i].y) 与 i-k(p[k].x-p[i].x),(p[k].y-p[i].y)if(v==0) return true;else return false;
}int main(){int n;cin>>n;for(int i=0; i<n; ++i) cin>>p[i].x>>p[i].y;vector<unordered_map<ll,vector<int>>> vec(n); // 存// 预处理,只需要耗时O(n^2),即可分堆,避免3层暴力的大量重复计算for(int i=0; i<n; ++i){unordered_map<ll,vector<int>> m; // 用半径的平方储存,这样就不用开方了for(int j=0; j<n; ++j){if(i==j) continue;ll len = get_radius(i,j);m[len].push_back(j); // 把这个点存进去}vec[i] = m; // 把map存入}// 最大的优点就是避免了许多无意义的重复计算int sum = 0;for(int i=0; i<n; ++i){ // 找到这个点,判断其内部的存储auto m = vec[i]; // 这个的出来的知识map结合,里面幼嫩多for(auto it=m.begin(); it!=m.end(); ++it){vector<int> p_m = it->second;if(p_m.size()<=1) continue; // 这种情况下,跳过for(int j=0; j<p_m.size(); ++j){for(int k=j+1; k<p_m.size(); ++k){if(is_parallel(i,p_m[j],p_m[k])) continue; // 共线sum++;}}}}cout<<sum<<endl;return 0;
}
Java
import java.util.*;
public class Main {public static void main(String[] args) {//输出部分//读取输入的点,并统计每个点的出现次数Scanner sc = new Scanner(System.in);int n = sc.nextInt();//输入点的数量int[] x = new int [n + 10];//存储每个点的x坐标int[] y = new int [n + 10];//存储每个点的y坐标HashMap<String, Integer> s = new HashMap<>();//统计每个点的出现次数//键是点的坐标,如("1 2")for(int i = 0; i < n; i++){x[i] = sc.nextInt();//输入第i个点的x坐标y[i] = sc.nextInt();//输入第i个点的y坐标String t = x[i] + " " + y[i];//将坐标拼接成字符串作为键s.put(t, s.getOrDefault(t , 0) + 1);//统计读点的出现次数}//计算核心部分//对于每个点i,计算它与其他所有点j的距离,并将距离相同的点分组long res = 0;//最终结果for(int i = 0; i < n; i++){HashMap< Long,List<Integer> > map = new HashMap<>();//存储距离相同的点的索引for(int j = 0; j < n; j++){if(i == j) continue;//跳过自己long d = (long)(Math.pow(x[i] - x[j], 2) + Math.pow(y[i] - y[j] , 2));//计算距离的平方List<Integer> list = map.getOrDefault(d, new ArrayList<>());//初始化列表list.add(j);//将点j加入对应的列表map.put(d,list);//更新map}//map是一个哈希表,键是距离的平方(d)值是一个列表,存储所有与点i距离为d的点的索引//d是点i和点j之间的距离的平方(为了节省计算量,没有开平方)for(long b : map.keySet()){List<Integer>list = map.get(b);//获取距离为b的所有点res += (list.size() * (list.size() - 1)) /2;//统计点的数量long c = 0;for(int j : list){long x3 = 2 * x[i] - x[j], y3 = 2 * y[i] - y[j];//计算对称带点x与y的坐标if(s.containsKey(x3 + " " + y3)){//拼接成字符串c += s.get(x3 + " " + y3);//统计对称点的出现次数}}res -= c/2;//减去重复统计的点对}}System.out.println(res);}
}

六、删边问题

问题描述

给定一个包含 NN 个结点 MM 条边的无向图 GG,结点编号 1...N1...N。其中每个结点都有一个点权 WiWi​。

你可以从 MM 条边中任选恰好一条边删除,如果剩下的图恰好包含 22 个连通分量,就称这是一种合法的删除方案。

对于一种合法的删除方案,我们假设 22 个连通分量包含的点的权值之和分别为 XX 和 YY,请你找出一种使得 XX 与 YY 的差值最小的方案。输出 XX 与 YY 的差值。

输入格式

第一行包含两个整数 NN 和 MM。

第二行包含 NN 个整数,W1,W2,...WNW1​,W2​,...WN​。

以下 MM 行每行包含 22 个整数 UU 和 VV,代表结点 UU 和 VV 之间有一条边。

输出格式

一个整数代表最小的差值。如果不存在合法的删除方案,输出 −1−1。

样例输入

4 4
10 20 30 40
1 2
2 1
2 3
3 4

样例输出

20

样例说明

由于 11 和 22 之间实际有 22 条边,所以合法的删除方案有 22 种,分别是删除 (2,3)(2,3) 之间的边和删除 (3,4)(3,4) 之间的边。

删除 (2,3)(2,3) 之间的边,剩下的图包含 22 个连通分量: {1,2}{1,2} 和 {3,4}{3,4},点权和分别是 3030、7070,差为 4040。

删除 (3,4)(3,4) 之间的边,剩下的图包含 22 个连通分量: {1,2,3}{1,2,3} 和 {4}{4},点权和分别是 6060、4040,差为 2020。

评测用例规模与约定

对于 20%20% 的数据,1≤N,M≤100001≤N,M≤10000。

对于另外 20%20% 的数据,每个结点的度数不超过 22。

对于 100%100% 的数据,1≤N,M≤2000001≤N,M≤200000,0≤Wi≤1090≤Wi​≤109,1≤U,V≤N1≤U,V≤N。


// 本题为tarjan算法的变种,不懂的,可以先搜一下基本用法(涉及图的知识),本文最底部,也有优质视频的链接
/*
  其实本题不难,只要有图的基础就行--(能看懂答案的前提)
  连通分量:图的一个子图,这个子图中,任意两点之间,都存在可达路径
  然后就是 tarjan 算法(懂得可以不用看,建议先看视频,知道tarjan是啥)
  *
    用dfn(发现时间戳)与low(最低可达祖先的发现时间戳)。确切的说,他俩都是个编号。
    然后用cnt(count)这个设置时间戳。每次++。
    --以上是tarjan算法模版--
    建立一个函数tarjan(n,fa) // n是现节点,fa是父节点,避免重复用的
    然后,递归调用每个现阶段子节点(大致会先将所有)
    此时有三种情况
      1、是未被遍历过的新节点
        (这时可以继续向下搜索,等回退到这里时,
        (更新一下low值,若果现节点的dfn小于子节点的low值(dfn<low),代表连通两节点的边能被割去
        (为了计数,可以在维护一个w集合,用于储存以本节点为结尾的总和
      2、遍历到了父节点
        (可以毫不犹豫的退回了)
      3、遍历到了非父节点的旧节点
        (这个可是更新low值的好时候
        (是为了给,回溯时,判断是否能构成联通图    做准备
  *
  // 拓展-从割边问题 -> 割点问题
  (割点问题时,需要将low小于等于dfn(low<=dfn)
  (为啥<=中,多了个等于?因为一旦删掉这个点,整个链子就会断开,Java解析下方有图解
*/

C++
#include <iostream>
#include <cmath>
#include <vector>
#define ll long long
using namespace std;
const ll N = 1e6+5;
const ll maxn = 0x3f3f3f3f3f3f3f3f; // 定义“伪最大值”
ll n,m,sum_value=0,cnt=0,ans=maxn; // sum_value总和,cnt计数器vector<ll> dfn(N,0),low(N,0);
vector<int> vec[N]; // 定义邻接表
vector<ll> value(N,0); // 每个节点的权值
vector<ll> node_sum(N,0); // 回退回来的节点总和void tarjan(int u, int fa){ // 现节点u、父节点fadfn[u]=low[u]=++cnt;for(int v:vec[u]){if(dfn[v]==0){   // 没遍历过tarjan(v,u);low[u] = min(low[v],low[u]);if(dfn[u]<low[v]) ans=min(ans,abs(sum_value-2*value[v]));value[u] += value[v];}else if(v!=fa){low[u]=min(low[u],low[v]);}}
}void slove(){ // 作为中转站cin>>n>>m;for(int i=1; i<=n; ++i) cin>>value[i],sum_value+=value[i];for(int i=0; i<m; ++i){ // 将无向图存入int r1,r2;cin>>r1>>r2;vec[r1].push_back(r2);vec[r2].push_back(r1);}// 现在啥都有了tarjan(1,0);if(value[1]!=sum_value) cout<<abs(sum_value-2*value[1])<<endl;else if(ans!=maxn) cout<<ans<<endl;else cout<<-1<<endl;
}int main(){slove();return 0;
}
Java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {// 定义常量 N 作为数组大小static final long N = (long) (1e6 + 5);// 定义“伪最大值”static final long maxn = 0x3f3f3f3f3f3f3f3fL;// 节点数量 n,边的数量 mstatic long n, m;// 所有节点权值总和static long sum_value = 0;// 时间戳计数器static long cnt = 0;// 存储最终结果static long ans = maxn;// 存储每个节点的发现时间戳static List<Long> dfn = new ArrayList<>();// 存储每个节点能回溯到的最早祖先的发现时间戳static List<Long> low = new ArrayList<>();// 邻接表,存储图的结构static List<List<Integer>> vec = new ArrayList<>();// 存储每个节点的权值static List<Long> value = new ArrayList<>();// Tarjan 算法核心函数static void tarjan(int u, int fa) {// 初始化当前节点的发现时间戳和最早祖先时间戳dfn.set(u, ++cnt);low.set(u, cnt);// 遍历当前节点的所有邻接节点for (int v : vec.get(u)) {if (dfn.get(v) == 0) { // 如果邻接节点未被访问过// 递归调用 Tarjan 算法处理邻接节点tarjan(v, u);// 更新当前节点的最早祖先时间戳low.set(u, Math.min(low.get(u), low.get(v)));// 如果当前节点的发现时间戳小于邻接节点的最早祖先时间戳,说明该边是割边if (dfn.get(u) < low.get(v)) {ans = Math.min(ans, Math.abs(sum_value - 2 * value.get(v)));}// 将邻接节点的权值累加到当前节点value.set(u, value.get(u) + value.get(v));} else if (v != fa) { // 如果邻接节点已被访问且不是父节点// 更新当前节点的最早祖先时间戳low.set(u, Math.min(low.get(u), low.get(v)));}}}// 主处理函数static void solve() {Scanner scanner = new Scanner(System.in);// 读取节点数量和边的数量n = scanner.nextLong();m = scanner.nextLong();// 初始化列表for (int i = 0; i <= n; i++) {dfn.add(0L);low.add(0L);value.add(0L);vec.add(new ArrayList<>());}// 读取每个节点的权值并计算总和for (int i = 1; i <= n; i++) {value.set(i, scanner.nextLong());sum_value += value.get(i);}// 读取边的信息并构建邻接表for (int i = 0; i < m; i++) {int r1 = scanner.nextInt();int r2 = scanner.nextInt();vec.get(r1).add(r2);vec.get(r2).add(r1);}// 从节点 1 开始进行 Tarjan 算法tarjan(1, 0);// 如果节点 1 的权值总和不等于所有节点的权值总和if (value.get(1) != sum_value) {System.out.println(Math.abs(sum_value - 2 * value.get(1)));} else if (ans != maxn) { // 如果找到了割边System.out.println(ans);} else { // 没有找到符合条件的割边System.out.println(-1);}}public static void main(String[] args) {// 调用主处理函数solve();}
}

 拓展(割点):

七、AB路线

问题描述

小明拿了 nn 条线段练习抓娃娃。他将所有线段铺在数轴上,第 ii 条线段的左端点在 lili​,右端点在 riri​。小明用 mm 个区间去框这些线段,第 ii 个区间的范围是 [LiLi​, RiRi​]。如果一个线段有 至少一半 的长度被包含在某个区间内,则将其视为被这个区间框住。请计算出每个区间框住了多少个线段?

输入格式

输入共 n+m+1n+m+1 行。

第一行为两个正整数 nn, mm。

后面 nn 行,每行两个整数 lili​, riri​。

后面 mm 行,每行两个整数 LiLi​, RiRi​。

输出格式

输出共 mm 行,每行一个整数。

样例输入

3 2
1 2
1 3
3 4
1 4
2 4

样例输出

3
2

评测用例规模与约定

对于 20%20% 的数据,保证 n,m≤103n,m≤103。

对于 100%100% 的数据,保证 n,m≤105n,m≤105,li<rili​<ri​,0<li,ri,Li,Ri≤1060<li​,ri​,Li​,Ri​≤106,max⁡{ri−li}≤min⁡{Ri−Li}max{ri​−li​}≤min{Ri​−Li​}.

/*
   审题 “小蓝最少要走多少步?”,“最少”
   BFS就是解决图-最短路径的特效药,
   DFS深搜也能搜到,但不一定是最短的,深搜更倾向于排列组合、解数独、八皇后,这种尝试性的算法。
   好了,确定本题的基调,就是广搜

   在开始之前,还需考虑一个问题,就是暴力搜索必然会超时,因此,枝减操作,必不可少。也就是要引入记忆化搜索。
   这个时候,就要思考,用什么存储记忆化搜索
   注意本题 "格子数,要是K的倍数,所以这里涉及到了k"
   -used[i][j][k]; 其中k来储存走到这个格式,连续走的步数。
   步数相同时,代表该地址已经被走过。相同的符号,相同的步数,所以可以直接跳过。
   (注意,这里不用三维数组标记,是会超时的)。

   所以本题用queue广搜、used[i][j][k]记忆化搜索、res[i][j][k]标记走的这个位置,用了多少步。
*/

C++ 
#include <iostream>
#include <queue>
using namespace std;const int N = 1e3+5;
const int step = 1e1+5;
struct node{int x;int y;int step;
};
int n,m,k;
queue<node> q; // 用队列,实现广搜
bool used[N][N][step]; // 预处理
int res[N][N][step]; // 表示,每个节点,都在那个状态走过
char grid[N][N];int xf[]={1,-1,0,0}; // 用来记录方向的改变
int yf[]={0,0,1,-1};int BFS(){q.push({0,0,0}); // 将第一个节点存入while(!q.empty()){node u = q.front(); q.pop(); // 取出该节点if(u.x==n-1 && u.y==m-1) return res[u.x][u.y][u.step];for(int i=0; i<4; ++i){int X = u.x+xf[i], Y = u.y+yf[i], st = u.step+1;if(X<0||X>=n||Y<0||Y>=m) continue; // 出边界if(st<k&&grid[X][Y]!=grid[u.x][u.y]) continue;if(st==k&&grid[X][Y]==grid[u.x][u.y]) continue;st = st%k; // 时刻更新着if(used[X][Y][st]) continue; // 都是更新之后,在遍历的used[X][Y][st]=true; // 表示遍历过res[X][Y][st]=res[u.x][u.y][u.step]+1; // 多走了一步q.push({X,Y,st});}}return -1; // 此时还没有解释,只能说明一件事,遍历到头了,没有结果。
}int main(){// 基本处理cin>>n>>m>>k;string str;for(int i=0; i<n; ++i){cin>>str;for(int j=0; j<m; ++j) grid[i][j]=str[j];}cout<<BFS();return 0;
}
Java
import java.math.BigInteger;
import java.util.*;public class Main {static long INF = (long) 1e18;public static void main(String[] args) {Scanner sc = new Scanner(System.in); int n = sc.nextInt();int m = sc.nextInt();int k = sc.nextInt();sc.nextLine();char[][] mg = new char[n][m];for (int i = 0; i < n; i++) {mg[i] = sc.nextLine().toCharArray();}LinkedList<Pair> qu = new LinkedList<Pair>();qu.add(new Pair(0, 0, 1));int[][] d = new int[][] {{0,1},{1,0},{0,-1},{-1,0}};boolean[][][] visited = new boolean[n][m][2 * k];for (int step = 0; !qu.isEmpty(); step++) {int num = qu.size();for (int i = 0; i < num; i++) {Pair pair = qu.pollFirst();int px = pair.x, py = pair.y, pf = pair.flag;if (visited[px][py][pf]) {continue;}visited[px][py][pf] = true;if (pair.x == n - 1 && pair.y == m - 1) {System.out.print(step);return;}for (int j = 0; j < 4; j++) {int x = px + d[j][0];int y = py + d[j][1];int f = (pf + 1) % (2 * k);if (x >= 0 && x < n && y >= 0 && y < m) {if (visited[x][y][f]) {continue;}if (pf < k && mg[x][y] == 'A' || pf >= k && mg[x][y] == 'B') {qu.addLast(new Pair(x, y, f));}}}}}System.out.print(-1);}
}class Pair {int x, y, flag;public Pair(int x, int y, int flag) {super();this.x = x;this.y = y;this.flag = flag;}
}

八、抓娃娃

问题描述

小明拿了 nn 条线段练习抓娃娃。他将所有线段铺在数轴上,第 ii 条线段的左端点在 lili​,右端点在 riri​。小明用 mm 个区间去框这些线段,第 ii 个区间的范围是 [LiLi​, RiRi​]。如果一个线段有 至少一半 的长度被包含在某个区间内,则将其视为被这个区间框住。请计算出每个区间框住了多少个线段?

输入格式

输入共 n+m+1n+m+1 行。

第一行为两个正整数 nn, mm。

后面 nn 行,每行两个整数 lili​, riri​。

后面 mm 行,每行两个整数 LiLi​, RiRi​。

输出格式

输出共 mm 行,每行一个整数。

样例输入

3 2
1 2
1 3
3 4
1 4
2 4

样例输出

3
2

评测用例规模与约定

对于 20%20% 的数据,保证 n,m≤103n,m≤103。

对于 100%100% 的数据,保证 n,m≤105n,m≤105,li<rili​<ri​,0<li,ri,Li,Ri≤1060<li​,ri​,Li​,Ri​≤106,max⁡{ri−li}≤min⁡{Ri−Li}max{ri​−li​}≤min{Ri​−Li​}.

// 聪明的你,一定用的暴力,聪明的你,一定超时o(* ̄▽ ̄*)ブ 
// 本题,用差分+前缀和,就能非常完美的解决问题
// 此外,本题预处理化的时候,一定要看清楚!
// 不要处理成2e5+5了,要开r、l、R、L。而不是n,m;

C++
#include <iostream>
#include <vector>
const int N = 2e6+5;
using namespace std;int main()
{int n,m;cin>>n>>m;vector<int> res(N,0);for(int i=0,r,l; i<n; ++i) cin>>l>>r,res[r+l]++; for(int i=1; i<N; ++i) res[i]+=res[i-1];for(int i=1,L,R; i<=m; ++i){cin>>L>>R;L*=2,R*=2;if(L==0) cout<<res[R]<<endl;else cout<<res[R]-res[L-1]<<endl;}return 0;
}
Java
import java.util.Scanner;public class SegmentQuery {public static void main(String[] args) {// 定义常量 N,用于数组大小final int N = 2000005;Scanner scanner = new Scanner(System.in);// 读取 n 和 m 的值int n = scanner.nextInt();int m = scanner.nextInt();// 创建长度为 N 的数组 res 并初始化为 0int[] res = new int[N];// 读取 n 条线段的左右端点信息for (int i = 0; i < n; i++) {int l = scanner.nextInt();int r = scanner.nextInt();// 对线段中点对应的数组元素加 1res[l + r]++;}// 构建前缀和数组for (int i = 1; i < N; i++) {res[i] += res[i - 1];}// 处理 m 个查询区间for (int i = 1; i <= m; i++) {int L = scanner.nextInt();int R = scanner.nextInt();// 将查询区间的左右端点乘以 2L *= 2;R *= 2;int result;// 处理左端点为 0 的边界情况if (L == 0) {result = res[R];} else {result = res[R] - res[L - 1];}// 输出结果System.out.println(result);}scanner.close();}
}    

后面的两道题,咱时间有限,就先跳过啦(~ ̄▽ ̄)~

等后续打国赛时,在拐回来写写。

当然大家有好的代码、解析,也可以发给我,让我瞅瞅。( •̀ ω •́ )✧,我贴上去。

知识点:

一、向量、点乘、叉乘

(AI整理)

1、向量:
由来:

早在古希腊时期,数学家与物理学家已经意识到某些量(如力、速度)兼具大小和方向。此时
已经蕴含了向量,但此时并未形成明确的概念与理论。

17世纪笛卡尔创建解析几何后,点的位置可用坐标来表示,线段的长度和方向可通过坐标差量化。
这为向量的代数表达,奠定了基础。

后来经过负数、四元数的启发、线性扩张论...等几代人努力与知识的迭代,向量才最终别确定下来。

定义:

基本属性:

常见运算:

2、点乘:

不要问,为啥叫点乘,这是一个非常可爱的问题 --> 因为两向量之间用 “点号” 相乘。

定义:

两向量之间相乘,结果为标量。

应用:
  • 判断两条边之间,是钝角(负数)、直角(0)、还是锐角(正数)
  • 一条边在另一条边上映射的长度
  • 计算力的做功。
3、叉乘:

也不要问,为啥叫叉乘,这是一个非常可爱的问题 --> 因为两向量之间用 “叉号” 相乘。

二维:

三维:
应用:

切记,判断点时,叉乘边的方向很重要。点的那条边,放在第二个。

求平行四边形与三角形的面积:

二维 两向量叉乘,求的是平行四边形的面积。除于2,求的是三角形。

点与直线的关系:

线段相交的检测:

点与直线关系,详解!!

二、浮点数比较

在编程中,通常不用==号,来进行浮点数比较。因为会出现精度误差。即便在数学中相等,在计算机中也不一定相等。

abs(a-b)<1e-6

通常用小于1e-6来测试差值。

1e-6在通常情况下是够用的,
它既不是那么严格(把本应该相同的数,判为不同)
它也不是那么宽松(把本不同的数,判为相同)

三、map与unordered_map

map底层为红黑树,unordered_map底层为哈希表

or,map(O(logN))的效率皆低于unordered_map(O(1))。

四、极大值(32位、64位、16进制)

  • INT32_MAX 是 32 位有符号整数的最大值,为 2,147,483,647。(2.15 × 10⁹)
  • 0x3f3f3f3f3f3f3f3f:转换为十进制为:1,082,367,756,170,655,743。(约 1.08 × 10¹⁸)
  • INT64_MAX:约 9.22 × 10¹⁸。

INT32_MAX是32位,标准最大值。
INT64_MAX是64位下,标准最大值。
0x3f3f3f3f3f3f3f3f,常常被归纳于“伪最大值”,它即起到最大值的作用,又能适当的相加。在图、树中,常被赋予权值,表示不可抵达的点。

五、广搜(BFS)与深搜(DFS)

广搜:

(队列)

  • 最短路径问题,常用于判断最短路径问题。
  • 图或树的层序遍历问题。
  • 判断连通性。
深搜:

(递归、栈)

  • 路径问题,寻找某一个点到另一个点的路径,可能不是最短路径。
  • 回溯问题,可用于某些需要试错的算法(解数独、八皇后)
  • 求解组合问题(全排列、组合等问题)DFS可以遍历所有有解空间。
  • 拓扑排序,暂时还不熟悉

六、vector的比较方案-map

在C++中,两个vector比较,是通过operate==,进行比较的。

先比较数组大小,在依次、逐个比较具体内容。

map可以以vector为键

std::map 基于红黑树(一种自平衡的二叉搜索树)。会通过排序确定位置。(operate<)

且vector已经重载过(operate <) 了,比较时,自动按照字典序比较。

unordered_map不可以以vector为键

键的要求是

1、能满足 哈希函数 转化为 哈希值。

2、能通过operate== 进行比较

虽然vector中定义了operate==,但是没有定义,哈希函数。

(总结:map都具备,unordered_map不能将vector转化为哈希函数)


借鉴视频、博客:

1、[算法]轻松掌握tarjan强连通分量 - 图


相关文章:

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…...

JVM介绍

JVM类加载器 栈指令重排序 类的JVM内存分配 堆内存GC模型...

HTML输出流

HTML 输出流 JavaScript 中**「直接写入 HTML 输出流」**的核心是通过 document.write() 方法向浏览器渲染过程中的数据流动态插入内容。以下是详细解释&#xff1a; 一、HTML 输出流的概念 1. 动态渲染过程 HTML 文档的加载是自上而下逐行解析的。当浏览器遇到 <script&…...

Kafka 的高可用性

Kafka 的高可用性主要通过副本机制、ISR&#xff08;In-Sync Replicas&#xff09;列表和控制器 Broker 来实现。这些机制共同确保了 Kafka 集群在部分节点故障时仍然可以正常运行&#xff0c;数据不会丢失&#xff0c;并且服务不会中断。 1. 副本机制 Kafka 的副本机制是其高…...

Centos7,tar包方式部署rabbitmq-3.7.6

1. 环境准备 安装编译工具和依赖包 yum -y install make gcc gcc-c glibc-devel m4 perl openssl openssl-devel ncurses-devel ncurses-devel xz xmlto perl 2. Erlang环境搭建 版本对应&#xff1a;https://www.rabbitmq.com/docs/which-erlang 解压到指定目录 tar -xv…...

RISC-V AIA学习3---APLIC 第二部分(APLIC 中断域的内存映射控制区域)

每个中断域都有一个专用的内存映射控制区域&#xff0c;用来处理该中断域的中断。 控制区域的大小是 4KB 的倍数&#xff0c;对齐到 4KB 边界。最小的有效控制区域是 16KB。 1. 控制区域的基本结构&#xff1a;部门文件柜 每个中断域就像公司的一个部门&#xff0c;有自己的 …...

顶刊【遥感目标检测】【TGRS】FFCA-YOLO遥感图像小目标检测

FFCA-YOLO for Small Object Detection in Remote Sensing Images FFCA-YOLO遥感图像小目标检测 0.论文摘要 摘要——特征表征不足、背景干扰等问题使得遥感图像中的小目标检测任务极具挑战性。尤其在算法需部署于星载设备进行实时处理时&#xff0c;需在有限计算资源下对精度…...

【人工智能】从 Llama 到 DeepSeek:开源大模型的演进与技术对比

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能的迅猛发展,开源大语言模型(LLM)在自然语言处理领域扮演着越来越重要的角色。本文从 Meta 的 Llama 系列开始,追溯开源大模…...

【PCB工艺】时序图(Timing Diagram)

时序图&#xff08;Timing Diagram&#xff09;是描述数字电路信号随时间变化的图示&#xff0c;广泛用于分析和设计时序逻辑电路&#xff0c;如锁存器&#xff08;Latch&#xff09;、触发器&#xff08;Flip-Flop&#xff09;、计数器、状态机等。这篇文章从时序图的原理、构…...

MATLAB 中,并行池(Parallel Pool)自动关闭的情况

在 MATLAB 中&#xff0c;并行池&#xff08;Parallel Pool&#xff09;的行为可以通过设置进行控制&#xff0c;但默认情况下&#xff0c;并行池不会自动关闭&#xff0c;除非满足某些条件或显式调用关闭命令。以下是关于并行池自动关闭机制的详细说明&#xff1a; 自动关闭的…...

[网安工具] SQL 注入自动探测工具 —— SQLMAP 使用手册

&#x1f31f;想了解其它网安工具&#xff1f;看看这个&#xff1a;[网安工具] 网安工具库 —— 工具管理手册 https://github.com/sqlmapproject/sqlmaphttps://github.com/sqlmapproject/sqlmap用法 | sqlmap 用户手册https://sqlmap.highlight.ink/usage 0x01&#xff1a;S…...

Python数据结构与算法-基础预热篇

目录 语言基础 1.内置函数 1.1math库 1.2collections 1.2.1Counter&#xff1a;计数器 1.2.2deque双端对列 1.2.3defaultdict有默认值的字典 1.3heapq堆&#xff08;完全二叉树&#xff09; 1.4functool 1.5itertools 1.5.1无限迭代器 1.5.2有限迭代器 1.5.3排列组合迭代器 2.序…...

构建可扩展、可靠的网络抓取、监控和自动化应用程序的终极指南

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 无论您是企业主、营销人员还是软件开发人员&#xff0c;您都很有可能在某个时候使用过 Web 自动化工具。每个人都希望更聪明地工作&#xf…...

【蓝桥杯】重点冲刺

【最高优先级】必考核心算法(占分60%以上) 动态规划(DP) 🌟🌟🌟 背包问题:01背包、完全背包(必须掌握空间优化的一维写法) 线性DP:最长上升子序列(LIS)、最长公共子序列(LCS) 路径问题:网格路径计数(含障碍物)、最小路径和 经典模型:打家劫舍、股票买卖问…...

质量工程师的2025:从“找bug“到“造质量“的职业进化

想象一下&#xff0c;2025年的某天&#xff1a;阅读原文 早晨&#xff0c;AI测试助手已经自动运行了夜间回归测试&#xff0c;并将可疑问题标记出来 你喝着咖啡&#xff0c;通过质量数据看板分析系统健康度 下午的会议上&#xff0c;你正用业务语言向产品经理解释&#xff1a…...

2025年CNG 汽车加气站操作工题目分享

CNG 汽车加气站操作工题目分享&#xff1a; 单选题 1、CNG 加气站中&#xff0c;加气机的加气软管应&#xff08; &#xff09;进行检查。 A. 每天 B. 每周 C. 每月 D. 每季度 答案&#xff1a;A 解析&#xff1a;加气软管是加气操作中频繁使用的部件&#xff0c;每天检…...

【QT5 多线程示例】线程池

线程池 【C并发编程】&#xff08;九&#xff09;线程池 QThreadPool 和 QRunnable 是 Qt 提供的线程池管理机制。QRunnable 是一个任务抽象类&#xff1b;定义任务逻辑需要继承QRunnable 并实现 run() 方法。QThreadPool 负责管理线程&#xff0c;并将 QRunnable 任务分配到…...

飞致云荣获“Alibaba Cloud Linux最佳AI镜像服务商”称号

2025年3月24日&#xff0c;阿里云云市场联合龙蜥社区发布“2024年度Alibaba Cloud Linux最佳AI镜像服务商”评选结果。 经过主办方的严格考量&#xff0c;飞致云&#xff08;即杭州飞致云信息科技有限公司&#xff09;凭借旗下MaxKB开源知识库问答系统、1Panel开源面板、Halo开…...

FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读

FAST-LIVO2 Fast, Direct LiDAR-Inertial-Visual Odometry论文阅读 论文下载论文翻译FAST-LIVO2: 快速、直接的LiDAR-惯性-视觉里程计摘要I 引言II 相关工作_直接方法__LiDAR-视觉&#xff08;-惯性&#xff09;SLAM_ III 系统概述IV 具有顺序状态更新的误差状态迭代卡尔曼滤波…...

kubesphere 终端shell连不上的问题

使用nginx代理kubesphere控制台会出现容器的终端shell连不上的问题 下面是一个样例配置可以解决这个问题&#xff1a; 注意修改为你的ip地址&#xff1a; upstream k8s { ip_hash; server masterip1:30880; server masterip2:30880; server masterip3:30880; } nginx.conf #…...

无人机,雷达定点飞行时,位置发散,位置很飘,原因分析

参考&#xff1a; 无人车传感器 IMU与GPS数据融合进行定位机制_gps imu 组合定位原始数-CSDN博客 我的无人机使用雷达定位&#xff0c;位置模式很飘 雷达的更新频率也是10HZ&#xff0c; 而px飞控的频率是100HZ&#xff0c;没有对两者之间的频率差异做出处理 所以才导致无人…...

外星人入侵(python设计小游戏)

这个游戏简而言之就是操作一个飞机对前方的飞船进行射击&#xff0c;和一款很久之前的游戏很像&#xff0c;这里是超级低配版那个游戏&#xff0c;先来看看效果图&#xff1a; 由于设计的是全屏的&#xff0c;所以电脑不能截图。。。。 下面的就是你操控的飞船&#xff0c;上面…...

Stereolabs ZED Box Mini:NVIDIA Orin™驱动,双GMSL2输入,智能机器视觉AI新选择”

Stereolabs近日推出了ZED Box Mini&#xff0c;这是一款专为视觉AI设计的紧凑型迷你电脑&#xff08;ECU&#xff09;。该产品搭载了NVIDIA Orin™系列处理器&#xff0c;具备强大的AI视觉处理能力&#xff0c;适用于机器人、智能基础设施和工业应用等多种场景。ZED Box Mini以…...

IP协议的介绍

网络层的主要功能是在复杂的网络环境中确定一个合适的路径.网络层的协议主要是IP协议.IP协议头格式如下: 1.4位版本号:指定IP协议的版本,常用的是IPV4,对于IPV4来说,这里的值就是4. 2.4位头部长度,单位也是4个字节,4bit表示的最大数字是15,因此IP头部的最大长度就是60字节 3.…...

【入门初级篇】布局类组件的使用(2)

【入门初级篇】布局类组件的使用&#xff08;2&#xff09; 视频要点 &#xff08;1&#xff09;2分栏场景介绍与实操演示 &#xff08;2&#xff09;3分栏场景介绍与实操演示 点击访问myBuilder产品运营平台 CSDN站内资源下载myBuilder 交流请加微信&#xff1a;MyBuilder8…...

高并发金融系统,“可观测-可追溯-可回滚“的闭环审计体系

一句话总结 在高并发金融系统中&#xff0c;审计方案设计需平衡"观测粒度"与"系统损耗"&#xff0c;通过双AOP实现非侵入式采集&#xff0c;三表机制保障操作原子性&#xff0c;最终形成"可观测-可追溯-可回滚"的闭环体系。 业务痛点与需求 在…...

(九)Spring Webflux

底层基于Netty实现的Web容器与请求/响应处理机制 参照&#xff1a;Spring WebFlux :: Spring Frameworkhttps://docs.spring.io/spring-framework/reference/6.0/web/webflux.html 一、组件对比 API功能 Servlet-阻塞式Web WebFlux-响应式Web 前端控制器 DispatcherServl…...

如何在Webpack中配置别名路径?

如何在Webpack中配置别名路径&#xff1f; 文章目录 如何在Webpack中配置别名路径&#xff1f;1. 引言2. 配置别名路径的基本原理3. 如何配置别名路径3.1 基本配置3.2 结合Babel与TypeScript3.2.1 Babel配置3.2.2 TypeScript配置 3.3 适用场景与最佳实践 4. 调试与常见问题4.1 …...

office_word中使用宏以及DeepSeek

前言 Word中可以利用DeepSeek来生成各种宏&#xff0c;从而生成我们需要各种数据和图表&#xff0c;这样可以大大减少我们手工的操作。 1、Office的版本 采用的是微软的office2016&#xff0c;如下图&#xff1a; 2、新建一个Word文档 3、开启开发工具 这样菜单中的“开发工具…...

利用GitHub Pages快速部署前端框架静态网页

文章目录 前言GitHub Pages 来部署前端框架&#xff08;Vue 3 Vite&#xff09;项目1、配置 GitHub Pages 部署2、将项目推送到 GitHub3、部署到 GitHub Pages4、访问部署页面5、修改代码后的更新部署顺序 前言 可以先参考&#xff1a; 使用 GitHub Pages 快速部署静态网页: …...

前端性能优化思路_场景题

20 万人同时在直播间打赏&#xff0c;前端优化需要考虑高并发、性能优化、流畅体验等问题&#xff0c;涉及 WebSocket 处理、消息去抖、虚拟列表优化、动画优化、CDN 加速 等多个方面。 WebSocket 高并发优化 &#xff08;1&#xff09;使用 WebSocket 替代轮询 轮询&#xf…...

45 55跳跃游戏解题记录

先是55跳跃游戏&#xff0c;暴力解法会怎样&#xff1f;会超出时间限制&#xff0c;而且有很多细节要注意&#xff1a; func canJump(nums []int) bool {// 处理空数组情况&#xff0c;当nums只剩一个元素时&#xff0c;nums[i:]导致越界。if len(nums) 0 {return false}// 如…...

一个简单的用C#实现的分布式雪花ID算法

雪花ID是一个依赖时间戳根据算法生成的一个Int64的数字ID&#xff0c;一般用来做主键或者订单号等。以下是一个用C#写的雪花ID的简单实现方法 using System; using System.Collections.Concurrent; using System.Diagnostics;public class SnowflakeIdGenerator {// 配置常量p…...

16个气象数据可视化网站整理分享

好的&#xff01;以下是关于“16个气象数据可视化网站整理分享”的软文&#xff1a; 16个气象数据可视化网站整理分享 气象数据可视化已成为现代气象研究、决策支持以及公众天气服务的重要组成部分。从天气预报到气候变化监测&#xff0c;全球许多气象数据可视化平台为专业人士…...

一周学会Flask3 Python Web开发-SQLAlchemy数据迁移migrate

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 模型类(表)不是一成不变的&#xff0c;当你添加了新的模型类&#xff0c;或是在模型类中添加了新的字段&#xff0c;甚至是修改…...

[原创](Modern C++)现代C++的关键性概念: 如何利用多维数组的指针安全地遍历所有元素

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …...

本地化智能运维助手:基于 LangChain 数据增强 和 DeepSeek-R1 的K8s运维文档检索与问答系统 Demo

写在前面 博文内容为基于 LangChain 数据增强 和 Ollams 本地部署 DeepSeek-R1实现 K8s运维文档检索与问答系统 Demo通过 Demo 对 LEDVR 工作流&#xff0c; 语义检索有基本认知理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我看远山&#xff0c;远山悲悯 持续分享技术干货…...

中间件框架漏洞攻略

中间件&#xff08;英语&#xff1a;Middleware&#xff09;是提供系统软件和应⽤软件之间连接的软件&#xff0c;以便于软件各部件之间的沟通。 中间件处在操作系统和更⾼⼀级应⽤程序之间。他充当的功能是&#xff1a;将应⽤程序运⾏环境与操作系统隔离&#xff0c;从⽽实…...

在 Ubuntu 上安装 Docker 的完整指南

1. 卸载旧版本(如有) 在安装新版本前,建议先卸载旧版本: sudo apt remove docker docker-engine docker.io containerd runc 2. 安装依赖包 更新软件包索引并安装必要的依赖: sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release 3. 添加 Do…...

Another Redis Desktop Manager下载安装使用

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Another Redis Desktop Manager下载安装使用…...

GitLab 中文版17.10正式发布,27项重点功能解读【一】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

mysql慢查询日志

在 MySQL 中&#xff0c;慢查询日志&#xff08;Slow Query Log&#xff09;用于记录执行时间超过指定阈值的 SQL 语句。通过分析慢查询日志&#xff0c;可以优化数据库性能。以下是查看和配置 MySQL 慢查询日志的详细步骤&#xff1a; 1. 检查慢查询日志是否已启用 登录 MySQ…...

unity 截图并且展现在UI中

using UnityEngine; using UnityEngine.UI; using System.IO; using System.Collections.Generic; using System; using System.Collections;public class ScreenshotManager : MonoBehaviour {[Header("UI 设置")]public RawImage latestScreenshotDisplay; // 显示…...

Linux上位机开发实践(MPP平台的核心构成)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 芯片行业是一个赢者通吃的行业。也就是说细分领域的前两名&#xff0c;相比较后来者而言&#xff0c;拥有很多无可比拟的优势。以安防市场的soc来说…...

Hosts文件与DNS的关系:原理、应用场景与安全风险

目录 引言 Hosts文件与DNS的基本概念 2.1 什么是Hosts文件&#xff1f; 2.2 什么是DNS&#xff1f; Hosts文件与DNS的关系 Hosts文件的应用场景 4.1 本地开发与测试 4.2 屏蔽广告与恶意网站 4.3 绕过DNS污染或劫持 Hosts文件的优势 5.1 解析速度快 5.2 不受DNS缓存影…...

Stable Diffusion vue本地api接口对接,模型切换, ai功能集成开源项目 ollama-chat-ui-vue

1.开启Stable Diffusion的api服务 编辑webui-user.bat 添加 –api 开启api服务&#xff0c;然后保存启动就可以了 2.api 文档地址 http://127.0.0.1:7860/docs3. 文生图 接口 地址 /sdapi/v1/txt2img //post 请求入参 {enable_hr: false, // 开启高清hrdenoising_stre…...

【含文档+源码】基于SpringBoot的过滤协同算法之网上服装商城设计与实现

项目介绍 本课程演示的是一款 基于SpringBoot的过滤协同算法之网上服装商城设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署…...

优化 Docker 构建之方法(Methods for Optimizing Docker Construction)

优化 Docker 构建之方法 优化 Docker 构建不仅是为了提高效率&#xff0c;它还是降低部署成本、确保安全性和保持跨环境一致性的有效方法。每个层、依赖项和配置选择都会影响镜像的大小、安全性和可维护性。大型镜像部署速度较慢且消耗更多资源&#xff0c;这会增加成本&#…...

谈谈空间复杂度考量,特别是递归调用栈空间消耗?

空间复杂度考量是算法设计的核心要素之一&#xff0c;递归调用栈的消耗问题在前端领域尤为突出。 以下结合真实开发场景进行深度解析&#xff1a; 一、递归调用栈的典型问题 1. 深层次DOM遍历的陷阱 // 危险操作&#xff1a;递归遍历未知层级的DOM树 function countDOMNode…...

四川省汽车加气站操作工备考题库及答案分享

1.按压力容器的设计压力分为&#xff08; &#xff09;个压力等级。 A. 三 B. 四 C. 五 D. 六 答案&#xff1a;B。解析&#xff1a;按压力容器的设计压力分为低压、中压、高压、超高压四个压力等级。 2.缓冲罐的安装位置在天然气压缩机&#xff08; &#xff09;。 A. 出口处 …...