【蓝桥杯】蓝桥杯算法复习(一)

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪

在这里插入图片描述

文章目录

  • 前言
  • 蓝桥杯复习(一)
    • 一、二分
      • 复习
      • 练习
    • 二、前缀和
      • 复习
      • 练习
    • 三、差分
      • 复习
      • 练习
    • 四、双指针
      • 复习
      • 练习
    • 五、归并
      • 复习
      • 练习
    • 六、多路归并
      • 复习
      • 练习
    • 七、贡献法
      • 复习
      • 练习

前言


本文适合有一定算法基础,但是由于各种原因已经很久没有敲代码的同学。本文以复习+练习为主,旨在通过练习算法题快速复习已经遗忘的算法。即使不是参加蓝桥杯的同学,如果符合上面的条件,依然可以参考本文进行复习。

如果你是新手,可以参考白晨的算法专栏进行学习。


蓝桥杯复习(一)


一、二分


复习

// 模板一
// 求满足check条件的最左下标
#include <iostream>using namespace std;template<class T>
int binary_search1(T* v, int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(v[mid])) // check中 v[mid] 永远放在前面,eg. v[mid] >= ar = mid;elsel = mid + 1;}return mid;
}// 模板二
// 求满足check条件的最右下标
#include <iostream>using namespace std;template<class T>
int binary_search1(T* v, int l, int r)
{while (l < r){int mid = l + r + 1 >> 1; // 必须加一,避免死循环if (check(v[mid])) // eg.v[mid] <= al = mid;elser = mid - 1;}return mid;
}

练习

image-20240301212306336

🍬题目链接:借教室

🍎算法思想

由于题目中给出了n 1 0 6 10^6 106,也即百万级别,所以应该使用时间复杂度为O(n)或者O(mlogn)(m较小),所以就不能直接模拟。

此题使用了差分和二分的思想,差分这里简单提一下:

一维差分数组是一种处理区间修改和查询的方法,它可以在O(1)的时间内实现对原数组某个区间内所有元素加上一个常数。具体来说,如果原数组是a[],差分数组是b[],那么有以下关系:

  • a[i] = b[1] + b[2] + … + b[i]
  • b[i] = a[i] - a[i-1]

详细差分算法的介绍可见:【算法】算法基础入门详解

本题目订单为先来后到,并且订单都是正整数,所以每分配一个订单的教室,剩余的教室会越来越少,订单1到订单m具有单调性。所以将其转化为查找最多可以满足多少订单,这样就可以使用二分查找来确定能够处理的最大订单数量。在二分查找的过程中,将订单数量的上下界初始化为 0 和 m,然后在每次迭代中计算中间值 mid,并通过 check 函数来判断是否能够处理 mid 个订单。

要注意二分的模板分为两个,我们这次求得是满足check的最右下标,所以使用模板二。

🍊具体实现

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;const int N = 1000010;int n, m;
int w[N];
int d[N], s[N], t[N];
LL b[N];bool check(int mid) 
{memset(b, 0, sizeof b);// 先差分,求出分配前mid订单后的差分数组for (int i = 1; i <= mid; ++i) {b[s[i]] += d[i];b[t[i] + 1] -= d[i];}// 判断此时是否满足条件LL cnt = 0;for (int i = 1; i <= n; ++i) {cnt += b[i];if (cnt > w[i]) return false;}return true;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);for (int i = 1; i <= m; i ++ ) scanf("%d%d%d", &d[i], &s[i], &t[i]);// 求满足最多订单的订单编号int l = 0, r = m;while (l < r) {int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}if (r == m) printf("0");else printf("-1\n%d", r + 1);return 0;
}

二、前缀和


复习

前缀和是指:

如果有一个数组s[N],那么其前缀和数组a[N]的定义为
a [ i ] = s [ 1 ] + s [ 2 ] + s [ 3 ] + . . . + s [ i ] a[i] = s[1]+s[2]+s[3]+...+s[i] a[i]=s[1]+s[2]+s[3]+...+s[i]
也即,前缀和就是数组s前i个数的总和,前缀和数组就是数组s前i个数的总和组成的数组。

有了这个数组,就可以以O(1)的时间复杂度算出s[l]~s[r]这段区间的总和:

s u m ( s [ l : r ] ) = a [ r ] − a [ l − 1 ] = s [ 1 ] + . . . + s [ l − 1 ] + s [ l ] + . . . + s [ r ] − s [ 1 ] − . . . s [ l − 1 ] = s [ l ] + . . . + s [ r ] sum(s[l:r])=a[r]-a[l-1]\\=s[1]+...+s[l-1]+s[l]+...+s[r]-s[1]-...s[l-1]\\=s[l]+...+s[r] sum(s[l:r])=a[r]a[l1]=s[1]+...+s[l1]+s[l]+...+s[r]s[1]...s[l1]=s[l]+...+s[r]

练习

image-20240303205526926

🍬题目链接:壁画

🍎算法思想

这个题的要点是被毁掉的墙段一定只与一段还未被毁掉的墙面相邻,所以被毁掉的墙壁一定是边缘的,不能是中间的,如果是中间的,就与两段未毁掉的墙壁相邻了。

理解了这个以后,还有几个点比较重要:

  1. 每天是先绘画,后毁坏,所以绘画的墙最后一定大于或等于被毁掉的墙;
  2. 绘画的墙一定是连续的,这就给使用前缀和创造了条件。

所以绘画的墙壁数量为 ⌈ n 2 ⌉ \lceil \frac{n}{2} \rceil 2n,现在如果证明出所有 ⌈ n 2 ⌉ \lceil \frac{n}{2} \rceil 2n的连续墙壁都可以取到就可。

现在,假设我们有长度为 n n n 的连续墙壁,考虑以下两种情况:

  1. 如果 n n n 是偶数,那么 ⌈ n 2 ⌉ = n 2 \lceil \frac{n}{2} \rceil = \frac{n}{2} 2n=2n。在这种情况下,由于人有先手优势,第一个可以涂你选定的那一段中间两个随便一个,接下来,如果墙从左边被毁下一次就涂上一次刚才涂画的左边的墙进行涂画,反之右边被毁就选上一次刚才涂画的右边的墙进行涂画,就是按照对称的方式走,这样走结果必然可以将选定的一段涂完。
  2. 如果 n n n 是奇数,那么 ⌈ n 2 ⌉ = n + 1 2 \lceil \frac{n}{2} \rceil = \frac{n+1}{2} 2n=2n+1。在这种情况下,先涂选定的一段中间的墙,后面同上,如果墙从左边被毁下一次就涂上一次刚才涂画的左边的墙进行涂画,反之右边被毁就选上一次刚才涂画的右边的墙进行涂画,也可以保证一定能涂完。

因此,无论 n n n 是偶数还是奇数,我们都可以选择任意一段 ⌈ n 2 ⌉ \lceil \frac{n}{2} \rceil 2n 个连续的墙壁进行涂色,所以问题转化为了求一段固定长度的连续区间的最大值,这里使用滑动窗口也可以做,但是今天复习的是前缀和,就拿前缀和做就可以了。

🍊具体实现

#include <iostream>
#include <cstring>
#include <algorithm>const int N = 5000010;int t, n;
char s[N];
int a[N];int main()
{scanf("%d", &t); // 输入测试用例数量for (int i = 1; i <= t; ++i){scanf("%d", &n); // 输入字符串长度scanf("%s", s + 1); // 输入字符串int res = 0;int cnt = (n + 1) / 2; // 滑动窗口的大小,取n的一半向上取整for (int j = 1; j <= n; ++j) {a[j] = a[j - 1] + s[j] - '0'; // 计算前缀和,即当前位置之前的数字和if (j >= cnt) res = std::max(res, a[j] - a[j - cnt]); // 更新结果,保证滑动窗口内数字的和最大}printf("Case #%d: %d\n", i, res); // 输出结果}return 0;
}

三、差分


复习

一维差分数组是一种处理区间修改和查询的方法,它可以在O(1)的时间内实现对原数组某个区间内所有元素加上一个常数。具体来说,如果原数组是a[],差分数组是b[],那么有以下关系:

  • a[i] = b[1] + b[2] + … + b[i]
  • b[i] = a[i] - a[i-1]

详细差分算法的介绍可见:【算法】算法基础入门详解

练习

image-20240303205350959

🍬题目链接:空调

🍎算法思想

针对每个位置,计算初始温度和目标温度之间的差值 a,然后利用 insert 函数将这个差值插入到差分数组 b 中。这个函数用来更新差分数组,以便跟踪累积的变化。

据题意,将一段区间升高或者降低1度在差分数组中就是将一个位置的数+1,另一个位置的数-1(这里注意如果到总区间最后一个也要改变,则可以理解为将其中一个位置+1或-1即可)。

所以,要将差分数组变为全0,也就是要将差分数组中全部正数和负数都通过-1和+1的操作变为0。最小的操作次数为 正数之和 和 负数之和的绝对值 中的最大值。

🍊具体实现

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010;int n;
int p[N], t[N];
int b[N];void insert(int e, int l, int r) 
{b[l] += e;b[r + 1] -= e;
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", &p[i]);for (int i = 1; i <= n; i++) scanf("%d", &t[i]);for (int i = 1; i <= n; i++) {// 求温差int a = p[i] - t[i];insert(a, i, i);}int pos = 0, neg = 0;for (int i = 1; i <= n; ++i) {if (b[i] > 0) pos += b[i];else neg -= b[i];}printf("%d", max(pos, neg));return 0;
}

四、双指针


复习

练习

image-20240305123043178

🍬题目链接:牛的学术圈 I

🍎算法思想

依题意,h满足两个条件:

  1. 引用次数最小为h - 1

  2. 值为h - 1的文章数 <= L

所以,最好先将文章的引用次数从大到小排序,i代表h的枚举,j代表从右到左第一个大于等于i的数的下标,第一个条件非常好判断,只用每次枚举的时候判断第i个数是否大于等于i - 1,第二个条件可以在输入的时候就用哈希表统计出每个数出现的次数,也可以使用双指针判断。

本次使用双指针判断,j代表从右到左第一个大于等于i的数的下标,也即下标大于j的数都小于i,而i必须满足第一个条件,也即a[i] >= i - 1,所以当a[i] = i - 1i - j的数就是值为i - 1的数的个数。

🍊具体实现

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010;int n, L;
int a[N];int main()
{scanf("%d%d", &n, &L);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);sort(a + 1, a + 1 + n, greater<int>()); // 从大到小排序int res = 0;for (int i = 1, j = n; i <= n; i++){while (j && a[j] < i) j--; // 找到从右到左第一个大于等于i的数的下标// 判断此时的i是否满足上面提到的两个条件if (a[i] >= i - 1 && i - j <= L) res = i;}printf("%d", res);return 0;
}

五、归并


复习

  • 逆序对个数

image-20221226164048933

🍬题目链接:逆序对的数量

// 逆序对个数#include <iostream>using namespace std;typedef long long ll;const int N = 100010;// 不开longlong见祖宗
int v[N], tmp[N];ll merge_sort(int v[], int l, int r)
{if (l >= r) return 0;int mid = l + r >> 1;ll res = merge_sort(v, l, mid) + merge_sort(v, mid + 1, r);int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r){if (v[i] <= v[j])tmp[k++] = v[i++];else{tmp[k++] = v[j++];// 逆序对的个数res += mid - i + 1; // v[i,mid] 都可以与 v[j] 组成逆序对}}while (i <= mid) tmp[k++] = v[i++];while (j <= r) tmp[k++] = v[j++];// 往原数组中还原for (i = l, j = 0; i <= r; ++i, ++j){v[i] = tmp[j];}return res;
}int main()
{int n;cin >> n;for (int i = 0; i < n; ++i)cin >> v[i];cout << merge_sort(v, 0, n - 1) << endl;return 0;
}

练习

image-20240306232012389

🍬题目链接:火柴排队

🍎算法思想

首先,简化一下问题,一个升序的序列a[]和一个随机序列b[],怎么调整第二个序列的顺序才能让 ∑ ( a i − b i ) 2 \sum(a_i -b_i)^2 (aibi)2最小,当然我们可以猜一下,当两个序列都是升序时, ∑ ( a i − b i ) 2 \sum(a_i -b_i)^2 (aibi)2最小。

可以反证一下,当第二个序列不是升序时,必然存在 b i > b i + 1 b_i>b_{i+1} bi>bi+1,此时得到的值为 ( a i − b i ) 2 + ( a i + 1 − b i + 1 ) 2 (a_i-b_i)^2+(a_{i+1}-b_{i+1})^2 (aibi)2+(ai+1bi+1)2,将其交换顺序可得, ( a i − b i + 1 ) 2 + ( a i + 1 − b i ) 2 (a_i-b_{i+1})^2+(a_{i+1}-b_{i})^2 (aibi+1)2+(ai+1bi)2,两者相减得到 2 ∗ ( a i − a i + 1 ) ( b i + 1 − b i ) > 0 2*(a_i-a_{i+1})(b_{i+1}-b_{i})>0 2(aiai+1)(bi+1bi)>0,所以交换后得到的值小,所以第二个序列必须为升序序列。

其次,一个升序的序列a[]和一个随机序列b[],最少要相邻交换多少次才能将b[]调整到升序?

b[]中逆序对的个数就是最少要相邻的次数。

因为相邻交换只会改变 b i , b i + 1 b_i,b_{i+1} bi,bi+1之间的位置关系,并不会影响到 b i , b i + 1 b_i,b_{i+1} bi,bi+1和其他数的位置关系,所以交换一次,要么就是逆序对的数量减一,要么就是逆序对的数加一(不存在相同的数)。所以,最小交换次数大于等于逆序对的个数。

在b[]中必然存在 b i > b i + 1 b_i>b_{i+1} bi>bi+1,也即相邻的逆序对,如果不满足,那么b[]就是升序的,所以每次交换必然可以交换一对逆序对。这样就可以得到,最小交换次数等于逆序对的个数。

最后,回到原问题,如果是a[]不是升序序列,那么应该怎么办?

我们可以对a[]做一个映射,将其映射为升序序列,再以对a[]做的映射为规则,对b[]做映射,只用求出b[]中的逆序对数量,就是最小的交换次数。

但是,这里有一个问题,a[]和b[]的数不相同呀,怎么进行映射?由于本题目并不涉及数组中的具体值,只涉及到数组间的相对大小(逆序对),所以可以将其进行离散化,按照其数组中的相对大小将其离散化到1~10000上,这样就可以保证a[]和b[]可以相互映射。

🍊具体实现

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010, mod = 99999997;int n;
int a[N], b[N];
int q[N], map[N];int merge_sort(int l, int r) 
{if (l >= r) return 0;int mid = l + r >> 1;int res = (merge_sort(l, mid) + merge_sort(mid + 1, r)) % mod;int i = l, j = mid + 1, k = 0;while (i <= mid && j <= r) {// 统计逆序对个数if (b[i] > b[j]) q[k++] = b[j++], res = (res + mid - i + 1) % mod;else q[k++] = b[i++];}while (i <= mid) q[k++] = b[i++];while (j <= r) q[k++] = b[j++];for (i = l, j = 0; i <= r; ++i, ++j) b[i] = q[j];return res;
}void handler(int t[])
{for (int i = 1; i <= n; ++i) q[i] = i;// 按照数组数据大小排下标,排到前面的是小数的下标sort(q + 1, q + n + 1, [&](int x, int y){return t[x] < t[y];});for (int i = 1; i <= n; ++i) t[q[i]] = i;
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);for (int i = 1; i <= n; ++i) scanf("%d", &b[i]);// 离散化handler(a), handler(b);// 对a数组的数做映射,使其成为升序数组// 并按照此映射规则映射b数组for (int i = 1; i <= n; ++i) map[a[i]] = i;for (int i = 1; i <= n; ++i) b[i] = map[b[i]];// 现在只要求出b数组的逆序对数,就是最小交换次数printf("%d", merge_sort(1, n));return 0;
}

六、多路归并


复习

多路归并(Multiway Merge)是一种常用的排序算法,用于合并多个已经排序的序列。它通常被用作外部排序算法,特别是在处理大型数据集时。

在多路归并中,假设有 k 个已经排好序的序列,每个序列包含 n 个元素。该算法将这 k 个序列合并成一个排序好的序列。多路归并的基本思路是维护一个大小为 k 的堆,每次从堆中选择最小的元素输出,并从相应的序列中取出下一个元素放入堆中,直到所有序列中的元素都被输出。

多路归并的时间复杂度取决于输入序列的总长度以及序列的个数。如果输入序列的总长度为 N,序列的个数为 k,那么多路归并的时间复杂度为 O(N * log(k))。

练习

image-20240307112719853

🍬题目链接:鱼塘钓鱼

🍎算法思想

枚举+多路归并:

钓鱼真正的有效时间 = 总时间 - 在路上的时间,在路上的时间就是到第i个鱼池所用的时间,在一个鱼池钓到鱼的数量只与呆在这个鱼池的时间有关,而鱼池的鱼的数量不会随着时间进行恢复,所以可以在一个鱼池利益最大化以后再走,不需要回头。

可以枚举最远到达第i个鱼池,再求出在有效时间内,前i个鱼池最多可以钓多少鱼。由于每个鱼池每分钟可获得的鱼数只与在本鱼池呆的时间有关,所以在每个鱼池每分钟获得鱼的数量就是一个递减的序列,i个递减序列,要求有限时间内获得鱼的最大值,就直接使用多路归并的思想,从前i鱼池中每次选择获得鱼数最多的池子进行钓鱼,最后得到的就是在有效时间内,前i个鱼池最多可以钓到的鱼数。

🍊具体实现

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 110;int n, t;
int a[N], d[N], w[N], s[N];// 求出此时第k个鱼池能获取的鱼数
int get(int k)
{return max(0, a[k] - d[k] * s[k]);
}int multi_merge(int k, int m)
{int res = 0;memset(s, 0, sizeof s);// 多路归并,求出前k个鱼池前m分钟的钓鱼的最大值for (int i = 1; i <= m; ++i) {int r = 1;// 直接循环求出最大值,如果是正规多路归并,应该使用堆,但是这里直接暴力循环也可以过for (int j = 2; j <= k; ++j) if (get(j) > get(r))r = j;res += get(r);s[r]++; //第r个鱼池呆的时长+1}return res;
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);for (int i = 1; i <= n; ++i) scanf("%d", &d[i]);for (int i = 2; i <= n; ++i) {scanf("%d", &w[i]);w[i] += w[i - 1];}scanf("%d", &t);int res = 0;// 枚举最远到哪个鱼池for (int i = 1; i <= n; ++i) {// 求出前n个鱼池在t分钟内钓到最大鱼数// 钓鱼真正的有效时间 = t - 在路上的时间res = max(res, multi_merge(i, t - w[i]));}printf("%d", res);return 0;
}

七、贡献法


复习

贡献法就是计算每个元素对最终答案的贡献是多少,在枚举的过程中加起来。所以这类题目的关键是想到如何在枚举的过程中计算各个元素的贡献。

练习

image-20240308105022165

🍬题目链接:孤独的照片

🍎算法思想

贡献法+枚举+乘法原理:

枚举每一个字符为一段连续字符串中唯一的字符,如果我们能快速求出以此字符为唯一的字符串有多少个,就能快速求出要丢掉的照片有多少个。

统计每一个字符左右各有多少个连续的与自身不同字符的数量,例如

HGGGH
下标从1开始s[5]='H',其左边有3个连续的G,l[5]=3,右边没有字符,r[5]=0
s[3]='G',左边为G,没有连续的H,所以l[3]=0,同理r[3]=0  

有了这些数据以后,
以 s [ i ] 为唯一的字符串数量 = l [ i ] ∗ r [ i ] + m a x ( l [ i ] − 1 , 0 ) + m a x ( r [ i ] − 1 , 0 ) 以s[i]为唯一的字符串数量 = l[i]*r[i]+max(l[i]-1,0)+max(r[i]-1,0) s[i]为唯一的字符串数量=l[i]r[i]+max(l[i]1,0)+max(r[i]1,0)
也即左边连续的串和右边连续的串排列组合,可以拼成的串的数量,左(1…n)和右(1…n)组合以及只有左或者只有右。

🍊具体实现

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 500010;typedef long long LL;int n;
char s[N];
// 统计s[i]左右各有多少个连续与s[i]不同的字符
int l[N], r[N];int main()
{scanf("%d", &n);scanf("%s", s + 1);// 从左统计s[i]的左侧有多少连续的与s[i]不同的字符,eg. HGGGH l[2]=1,l[5]=3 for (int i = 1, h = 0, g = 0; i <= n; ++i)if (s[i] == 'G') l[i] = h, h = 0, g++;else l[i] = g, g = 0, h++;// 从右统计s[i]的右侧有多少连续的与s[i]不同的字符,eg. HGGGH r[1]=3,r[4]=1 for (int i = n, h = 0, g = 0; i >= 1; --i)if (s[i] == 'G') r[i] = h, h = 0, g++;else r[i] = g, g = 0, h++;LL res = 0;for (int i = 1; i <= n; ++i) res += (LL)l[i] * r[i] + max(l[i] - 1, 0) + max(r[i] - 1, 0);printf("%lld", res);return 0;
}

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

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

相关文章

Vue源码系列讲解——过滤器篇【三】(解析过滤器)

目录 1. 前言 2. 在何处解析过滤器 3. parseFilters函数分析 4. 小结 1. 前言 在上篇文章中我们说了&#xff0c;无论用户是以什么方式使用过滤器&#xff0c;终归是将解析器写在模板中&#xff0c;既然是在模板中&#xff0c;那它肯定就会被解析编译&#xff0c;通过解析用…

【自动化】PyoutuGUI操作键鼠

自动化之PyoutuGUI操作键鼠 文章目录 自动化之PyoutuGUI操作键鼠  &#x1f449;引言&#x1f48e;一、初始化环境二、键盘鼠标事件三、消息框功能四、案例实战自动登录WPS 五、问题解决 &#x1f449;引言&#x1f48e; 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一…

EF类和E/F类功率放大器(能量转换器)的波形推导和理想仿真--基于Matlab和ADS

EF类和E/F类功率放大器&#xff08;能量转换器&#xff09;的波形推导和理想仿真–基于Matlab和ADS 参考论文&#xff1a;Modeling and Analysis of Class EF and Class E/F Inverters With Series-Tuned Resonant Networks(2016) 这篇文章的思路和MTT的文章A Generalized Hi…

存储引擎的简介

简介&#xff1a; 1.在mysql存储引擎可以说就是指表的类型&#xff0c;可以称为表处理器&#xff0c;以表的形式存储。 2.他的功能就是接收上层传下来的指令&#xff0c;然后对表中的数据进行提取写入操作。 目的&#xff1a; 为了管理方便&#xff0c;我们把连接管理&#xf…

如何在一个pycharm项目中创建jupyter notebook文件,并切换到conda环境中

1、第一步可以直接在pycharm项目中创建jupyter notebook文件 2、假若想要切换成pytorch环境做实验例子&#xff0c;会发现报这个错误 Jupyter server process exited with code 1 C:\Users\12430\.conda\envs\pytorch3.11\python.exe: No module named jupyter在这里&#xff…

Canvas笔记05:绘制文本,可视化图表中最常用

hello&#xff0c;我是贝格前端工场&#xff0c;最近在学习canvas&#xff0c;分享一些canvas的一些知识点笔记&#xff0c;本期分享canvas绘制文本的知识&#xff0c;欢迎老铁们一同学习&#xff0c;欢迎关注&#xff0c;如有前端项目可以私信贝格。 Canvas绘制文本是指使用H…

【粉丝福利第四期】:《低代码平台开发实践:基于React》(文末送书)

文章目录 前言一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望《低代码平台开发实践&#xff1a;基于React》五、粉丝福利 前言 随着数字化转型的深入&#xff0c;企业对应用开发的效率和灵活性要求越来越高…

PyTorch之完整的神经网络模型训练

简单的示例&#xff1a; 在PyTorch中&#xff0c;可以使用nn.Module类来定义神经网络模型。以下是一个示例的神经网络模型定义的代码&#xff1a; import torch import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()# 定义神经…

运维打工人,兼职跑外卖的第二个周末

北京&#xff0c;晴&#xff0c;西南风1级。 前序 今天天气还行&#xff0c;赶紧起来&#xff0c;把衣服都洗洗&#xff0c;准备准备&#xff0c;去田老师吃饭早饭了。 一个甜饼、一个茶叶蛋、3元自助粥花费7.5。5个5挺吉利的。 跑外卖的意义 两个字减肥&#xff0c;记录刚入…

基于最小二乘递推算法的系统参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于最小二乘递推算法的系统参数辨识。对系统的参数a1&#xff0c;b1&#xff0c;a2&#xff0c;b2分别进行估计&#xff0c;计算估计误差以及估计收敛曲线&#…

如何在Windows中对硬盘进行分区?这里有详细步骤

本文介绍如何在Windows11、10、8、7、Vista和XP中对硬盘进行分区 如果这个过程听起来比你想象的要复杂一点,不要担心,因为事实并非如此。在Windows中对硬盘进行分区一点也不难,通常只需要几分钟。以下是操作方法。 注意:这些说明适用于Windows 11、Windows 10、Windows 8…

腾讯云轻量应用服务器流量用完了怎么办?

腾讯云轻量服务器流量用完了怎么办&#xff1f;超额流量另外支付流量费&#xff0c;流量价格为0.8元/GB&#xff0c;会自动扣你的腾讯云余额&#xff0c;如果你的腾讯云账号余额不足&#xff0c;那么你的轻量应用服务器会面临停机&#xff0c;停机后外网无法访问&#xff0c;继…

js【详解】Promise

为什么需要使用 Promise &#xff1f; 传统回调函数的代码层层嵌套&#xff0c;形成回调地狱&#xff0c;难以阅读和维护&#xff0c;为了解决回调地狱的问题&#xff0c;诞生了 Promise 什么是 Promise &#xff1f; Promise 是一种异步编程的解决方案&#xff0c;本身是一个构…

自然语言处理之语言模型(LM)介绍

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;的一个重要分支&#xff0c;它旨在使计算机能够理解、解释和生成人类语言。在自然语言处理中&#xff0c;语言模型&…

阿珊详解Vue Router的守卫机制

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【漏洞复现】Salia PLCC cPH2 远程命令执行漏洞(CVE-2023-46359)

0x01 漏洞概述 Salia PLCC cPH2 v1.87.0 及更早版本中存在一个操作系统命令注入漏洞&#xff0c;该漏洞可能允许未经身份验证的远程攻击者通过传递给连接检查功能的特制参数在系统上执行任意命令。 0x02 测绘语句 fofa&#xff1a;"Salia PLCC" 0x03 漏洞复现 ​…

video视频播放

1.列表页面 <template><div><ul><li class"item" v-for"(item,index) in list" :key"index" click"turnPlay(item.videoUrl)"><img :src"item.img" alt""><div class"btn…

套接字编程 --- 一

目录 1. 预备知识 1.1. 端口号 1.2. 认识TCP协议 1.3. 认识UDP协议 1.4. 网络字节序 2. socket 2.1. socket 常见系统调用 2.1.1. socket 系统调用 2.1.2. bind 系统调用 2.1.3. recvfrom 系统调用 2.1.4. sendto系统调用 2.3. 其他相关接口 2.3.1. bzero 2.3.2…

力扣:17. 电话号码的字母组合

力扣&#xff1a;17. 电话号码的字母组合 描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输…

Linux——文件重定向

目录 前言 一、重定向 二、重定向的运用 三、dup2 四、命令行中的重定向 五、为什么要有标准错误 前言 在之前我们学习了文件标识符&#xff0c;直到close可以使用文件标识符进行关闭&#xff0c;但是当我们关闭1号&#xff08;stdout&#xff09;时&#xff0c;无法往显…