算法模板(4):动态规划(4) 做题积累(2)

news2024/11/18 1:41:36

动态规划

9. 单调队列优化DP

1. 1088. 旅行问题

John 打算驾驶一辆汽车周游一个环形公路。

公路上总共有 n 个车站,每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。

John 必须从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。

在一开始的时候,汽车内油量为零,John 每到一个车站就把该站所有的油都带上(起点站亦是如此),行驶过程中不能出现没有油的情况。

任务:判断以每个车站为起点能否按条件成功周游一周。

  • 做法:把环形序列扩展一倍成一条链,设距离是 d i d_i di,加油站的油量是 o i o_i oi,打一个 o i − d i o_i - d_i oidi 的前缀和,从第 k k k 个点出发可以到达,等价于 ∀ i ∈ [ k , k + n − 1 ] , s [ i ] − s [ k − 1 ] ≥ 0 \forall i \in [k, k + n - 1],s[i]-s[k - 1] \ge 0 i[k,k+n1],s[i]s[k1]0,即可以找到长度为 n n n 的窗口的最小值,然后减去 s [ k − 1 ] s[k - 1] s[k1] 看看是否大于等于 0.
  • 细节巨多.
#include<bits/stdc++.h>
using namespace std;
const int N = 2000010;
typedef long long ll;
ll o[N], d[N], s[N];
int q[N], n;
int st[N];

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d%d", &o[i], &d[i]);
    for(int i = 1; i <= n; i++)
    {
        s[i] = s[i + n] = o[i] - d[i];
    }
    for(int i = 1; i <= 2 * n; i++) s[i] += s[i - 1];

    int hh = 0, tt = -1;
    
    //顺时针
    for(int i = 2 * n; i; i--)
    {
        if(q[hh] >= n + i) hh++;
        while(hh <= tt && s[q[hh]] >= s[i]) tt--;
        q[++tt] = i;
        if(i <= n)
        {
            if(s[q[hh]] - s[i - 1] >= 0) st[i] = true;
        }
    }
    
    //逆时针,整个前缀和序列会发生变化
    
    hh = 0, tt = -1;
    d[0] = d[n];
    for(int i = 1; i <= n; i++) s[i] = s[i + n]= o[i] - d[i - 1];
    for(int i = 2 * n; i; i--) s[i] += s[i + 1];
    
    for(int i = 1; i <= 2 * n; i++)
    {
        if(q[hh] <= i - n) hh++;
        while(hh <= tt && s[q[hh]] >= s[i]) tt--;
        q[++tt] = i;
        if(i > n)
        {
            //注意这里是 st[i - n] 
            if(s[q[hh]] - s[i + 1] >= 0) st[i - n] = true;
        }
    }
    
    for(int i = 1; i <= n; i++)
    {
        printf("%s\n", st[i] ? "TAK" : "NIE");
    }
    return 0;
}

2. 1090. 绿色通道

  • 高二数学《绿色通道》总共有 n n n 道题目要抄,编号 1 , 2 , … , n 1,2,…,n 1,2,,n,抄第 i i i 题要花 a i a_i ai 分钟。小 Y 决定只用不超过 t t t 分钟抄这个,因此必然有空着的题。连续空着的题目(称为空题段)越多,老师越生气。小 Y 想让最长的空题段长度尽可能地小,请输出这个最小值.
  • 二分一下,就和 烽火传递 思路一样了.
#include<bits/stdc++.h>
using namespace std;
const int N = 50010;
int q[N], w[N], f[N];
int n, t;

bool check(int m)
{
    int hh = 0, tt = -1;
    q[++tt] = 0;
    for(int i = 1; i <= n; i++)
    {
        if(q[hh] < i - m - 1) hh++;
        f[i] = f[q[hh]] + w[i];
        while(hh <= tt && f[q[tt]] >= f[i]) tt--;
        q[++tt] = i;
    }
    
    for(int i = n - m; i <= n; i++)
    {
        if(f[i] <= t) return true;
    }
    return false;
}

int main()
{
    scanf("%d%d", &n, &t);
    for(int i = 1; i <= n; i++) scanf("%d", &w[i]);
    int l = 0, r = n;
    while(l < r)
    {
        int mid = (l + r) / 2;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    printf("%d\n", l);
    return 0;
}

3. 1087. 修剪草坪

FJ 有 N N N 只排成一排的奶牛,编号为 1 1 1 N N N。每只奶牛的效率是不同的,奶牛 i i i 的效率为 E i E_i Ei。编号相邻的奶牛们很熟悉,如果 FJ 安排超过 K K K 只编号连续的奶牛,那么这些奶牛就会罢工去开派对。因此,现在 FJ 需要你的帮助,找到最合理的安排方案并计算 FJ 可以得到的最大效率。注意,方案需满足不能包含超过 K K K 只编号连续的奶牛。

这个题有一个很简单的做法,就是类似于 烽火传递 那个题,不过我们这次是选出来不选的牛,让这些牛的效率之和最小。可以转化为在长度为 K + 1 K+1 K+1 的连续子序列中至少选择一个数字问最小值 r e s res res,所有权值之和是 s u m sum sum,答案就是 s u m − r e s . sum - res. sumres.

f ( i ) f(i) f(i):在前 i i i 头牛里面选,方案最大值。那么不选第 i i i 头牛的话就是 f ( i ) = f ( i − 1 ) f(i) = f(i - 1) f(i)=f(i1),当然也可以选择从 i − j + 1 ∼ i i - j + 1 \sim i ij+1i 头牛,且不选第 i − j i - j ij 头牛。就是 f ( i − j − 1 ) + s [ i ] − s [ i − j ] f(i - j -1) + s[i] - s[i - j] f(ij1)+s[i]s[ij],记 f ( i − j − 1 ) − s [ i − j ] = g ( i − j ) f(i - j - 1) - s[i - j] = g(i - j) f(ij1)s[ij]=g(ij),即 g ( i ) = f ( i − 1 ) − s [ i ] g(i) = f(i - 1) - s[i] g(i)=f(i1)s[i]. 因此 f ( i ) = max ⁡ { f ( i − 1 ) , g ( i − j ) + s [ i ] } f(i) = \max\{f(i -1), g(i - j) + s[i]\} f(i)=max{f(i1),g(ij)+s[i]}. 因此我们需要找到 max ⁡ \max\limits_{} max

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef long long ll;
ll f[N], g[N], q[N], s[N];
int n, k;
int main()
{
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; i++)
    {
        scanf("%lld", &s[i]);
        s[i] += s[i - 1];
    }

    int hh = 0, tt = -1;
    q[++tt] = 0;
    for(int i = 1; i <= n; i++)
    {
        if(q[hh] < i - k) hh++;
        f[i] = max(f[i - 1], g[q[hh]] + s[i]);
        g[i] = f[i - 1] - s[i];
        while(hh <= tt && g[q[tt]] <= g[i]) tt--;
        q[++tt] = i;
    }

    printf("%lld\n", f[n]);
    return 0;
}

4. 1091. 理想的正方形

  • 题意:有一个 a × b a\times b a×b 的整数组成的矩阵,现请你从中找出一个 n × n n\times n n×n 的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
  • 二维单调队列,求方框内的最大值和最小值.

保存一个二维单调队列 d e q u e < i n t > c o l [ M ] deque<int> col[M] deque<int>col[M],记录第 j j j 列的滑动窗口最大值;以及当前行的单调队列 d e q u e < i n t > r o w deque<int>row deque<int>row,记录方框内 c o l [ j − k + 1 : j ] . f r o n t ( ) col[j - k + 1:j].front() col[jk+1:j].front() 的最大值。每次先用 w [ i , j ] w[i,j] w[i,j] 更新第 j j j 列的状态(即 c o l [ j ] . b a c k ( ) col[j].back() col[j].back()),再用 c o l [ j ] . f r o n t ( ) col[j].front() col[j].front() 更新 r o w row row 的状态.

这道题卡时间了,然后我把 O1 O2 O3 优化全开了,然后就过了.

#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define x first
#define y second

using namespace std;
const int N = 1010;
typedef pair<int, int> P;
deque<int> col_max[N], col_min[N];
deque<P> row_max, row_min;
int n, m, k;
int w[N][N];
int ans = 0x3f3f3f3f;
int main()
{
    scanf("%d%d%d", &n, &m, &k);
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            scanf("%d", &w[i][j]);
        }
    }
    for(int i = 1; i <= n; i++)
    {
        row_max.clear(), row_min.clear();
        for(int j = 1; j <= m; j++)
        {
            if(col_max[j].size() && col_max[j].front() < i - k + 1) col_max[j].pop_front();
            if(col_min[j].size() && col_min[j].front() < i - k + 1) col_min[j].pop_front();
            if(row_max.size() && row_max.front().y < j - k + 1) row_max.pop_front();
            if(row_min.size() && row_min.front().y < j - k + 1) row_min.pop_front();

            while(col_max[j].size() && w[col_max[j].back()][j] <= w[i][j]) col_max[j].pop_back();
            col_max[j].push_back(i);
            while(col_min[j].size() && w[col_min[j].back()][j] >= w[i][j]) col_min[j].pop_back();
            col_min[j].push_back(i);

            while(row_max.size() && row_max.back().x <= w[col_max[j].front()][j]) row_max.pop_back();
            row_max.push_back({w[col_max[j].front()][j], j});
            while(row_min.size() && row_min.back().x >= w[col_min[j].front()][j]) row_min.pop_back();
            row_min.push_back({w[col_min[j].front()][j], j});

            if(i >= k && j >= k)
            {
                ans = min(ans, row_max.front().x - row_min.front().x);
            }
        }
    }
    printf("%d\n", ans);
}

10. 斜率优化DP(凸包优化)

1.1 301. 任务安排2

1.2 302. 任务安排3

N N N 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这 N N N 个任务分成若干批,每一批包含连续的若干个任务。从时刻 0 0 0 开始,任务被分批加工,执行第 i i i 个任务所需的时间是 T i T_i Ti。另外,在每批任务开始前,机器需要 S S S 的启动时间,故执行一批任务所需的时间是启动时间 S S S 加上每个任务所需时间之和。一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数 C i C_i Ci。请为机器规划一个分组方案,使得总费用最小。

情况一:

  • 1 ≤ n ≤ 5000 , 0 ≤ S ≤ 50 , 1 ≤ T i , C i ≤ 100 1 \le n \le 5000,0\le S \le 50,1 \le T_i,C_i \le 100 1n5000,0S50,1Ti,Ci100. 用 O ( n 2 ) O(n^2) O(n2) 来写

f ( i ) f(i) f(i) 为分配任务 1 ∼ i 1 \sim i 1i 的最小花费。假设上一批最后一个任务编号是 j j j. 那么,新分配一个任务的对答案多出来的启动时间的花费是 S ∗ ( s u m C n − s u m C j ) S * (sumC_n - sumC_j) S(sumCnsumCj) ,任务本身的花费是 s u m T i ∗ ( s u m C i − s u m C j ) sumT_i*(sumC_i - sumC_j) sumTi(sumCisumCj). 即 f ( i ) = min ⁡ 0 ≤ j < i { f ( j ) + s u m T i ∗ ( s u m C i − s u m C j ) + S ∗ ( s u m C n − s u m C j ) } f(i) = \min\limits_{0 \le j < i} \{ f(j) + sumT_i*(sumC_i - sumC_j) + S * (sumC_n - sumC_j)\} f(i)=0j<imin{f(j)+sumTi(sumCisumCj)+S(sumCnsumCj)}.

#include<bits/stdc++.h>
using namespace std;
const int N = 5010;
int f[N], sumC[N], sumT[N];
int n, S;
int main()
{
    scanf("%d%d", &n, &S);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d%d", &sumT[i], &sumC[i]);
        sumT[i] += sumT[i - 1], sumC[i] += sumC[i - 1];
    }
    
    memset(f, 0x3f, sizeof f);
    f[0] = 0;
    
    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j < i; j++)
        {
            f[i] = min(f[i], f[j] + sumT[i] * (sumC[i] - sumC[j]) + S * (sumC[n] - sumC[j])); 
        }
    }
    printf("%d\n", f[n]);
    return 0;
}

情况二

  • 1 ≤ n ≤ 3 ∗ 1 0 5 , 1 ≤ T i , C i ≤ 512 , 0 ≤ S ≤ 512 1 \le n \le 3*10^5,1≤T_i,C_i≤512,0≤S≤512 1n3105,1Ti,Ci512,0S512.
  • 由于和 i i i 相关的可以看作定值,和 j j j 相关的可以看作变量。因此原等式可以这样做变化: f ( j ) = ( s u m T i + S ) ∗ s u m C j + f ( i ) − s u m T i ∗ s u m C i − S ∗ s u m C n f(j) = (sumT_i + S) * sumC_j +f(i) - sumT_i * sumC_i - S * sumC_n f(j)=(sumTi+S)sumCj+f(i)sumTisumCiSsumCn.

可以看作直线 y = k x + b y = kx + b y=kx+b y y y f ( j ) f(j) f(j),斜率是 s u m T i + S sumT_i+S sumTi+S x x x s u m C j sumC_j sumCj,截距 b b b 可以看作 f ( i ) − s u m T i ∗ s u m C i − S ∗ s u m C n f(i) - sumT_i * sumC_i - S * sumC_n f(i)sumTisumCiSsumCn . 而 f ( j ) f(j) f(j) s u m C j sumC_j sumCj 是之前就计算出来的,目标是让 f ( i ) f(i) f(i) 最小,就是让截距最小. 我们发现,如果把 ( s u m C j , f ( j ) ) (sumC_j,f(j)) (sumCj,f(j)) 画在坐标系中,那么可以和答案有关的点一定是在凸包的边界上。这道题的斜率都是正数.

此题特点是斜率单调递增,横坐标也单调递增

在查询的时候,可以将队头小于当前斜率的点全部删掉;在插入的时候,将队尾所有不在凸包上的点全部删掉. 当然对于这个题横坐标 s u m C i sumC_i sumCi 本身就是单调递增的.

因此查询的点一定是一直往右走,因此查询的时候遇到斜率小与 s u m C i sumC_i sumCi 的就可以删掉了(但是要注意与上一个点的相对斜率不一定会比上一个相对斜率大).

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N = 300010;
typedef long long ll;

ll f[N], C[N], T[N], q[N], s;
int n;
int main()
{
    scanf("%d%lld", &n, &s);

    for(int i = 1; i <= n; i++)
    {
        scanf("%lld%lld", &T[i], &C[i]);
        T[i] += T[i - 1], C[i] += C[i - 1];
    }

    int hh = 0, tt = -1;
    q[++tt] = 0;

    for(int i = 1; i <= n; i++)
    {
        while(hh < tt && f[q[hh + 1]] - f[q[hh]] <= (T[i] + s) * (C[q[hh + 1]] - C[q[hh]])) hh++;
        int j = q[hh];
        f[i] = f[j] + T[i] * C[i] + s * C[n] - (T[i] + s) * C[j];
        while(hh < tt && (f[q[tt]] - f[q[tt - 1]]) * (C[i] - C[q[tt]]) >= (f[i] - f[q[tt]]) * (C[q[tt]] - C[q[tt - 1]])) tt--;
        q[++tt] = i;
    }
    printf("%lld\n", f[n]);

    return 0;
}

情况三

  • 1 ≤ n ≤ 3 ∗ 1 0 5 , 0 ≤ S , C i ≤ 512 , − 512 ≤ T i ≤ 512. 1 \le n \le 3 * 10 ^5, 0 \le S,C_i \le 512,-512 \le T_i \le 512. 1n3105,0S,Ci512,512Ti512.

  • 此题特点是斜率可能不单调,但横坐标 s u m C i sumC_i sumCi 仍然是单调递增的.

  • 处理方法是:在查询的时候,只能二分来找;在插入的时候,把不在凸包上的点全部删掉.

补充一句,如果横坐标不单调递增,那么需要有增添操作,那么需要用平衡树维护.

#include<bits/stdc++.h>
using namespace std;
const int N = 300010;
typedef long long ll;
ll s, C[N], T[N], f[N];
int n, q[N];
int main()
{
    scanf("%d%lld", &n, &s);
    for(int i = 1; i <= n; i++)
    {
        scanf("%lld%lld", &T[i], &C[i]);
        T[i] += T[i - 1], C[i] += C[i - 1];
    }

    int hh = 0, tt = -1;
    q[++tt] = 0;
    for(int i = 1; i <= n; i++)
    {
        int l = hh, r = tt;
        //考虑清楚二分的边界.
        while(l < r)
        {
            int mid = (l + r) / 2;
            if((f[q[mid + 1]] - f[q[mid]]) > (__int128)(T[i] + s) * (C[q[mid + 1]] - C[q[mid]])) r = mid;
            else l = mid + 1;
        }

        int j = q[l];
        f[i] = f[j] + (__int128)T[i] * C[i] + (__int128)s * C[n] - (__int128)(T[i] + s) * C[j];
        while(hh < tt && (__int128)(f[q[tt]] - f[q[tt - 1]]) * (C[i] - C[q[tt]]) >= (__int128)(f[i] - f[q[tt]]) * (C[q[tt]] - C[q[tt - 1]])) tt--;
        q[++tt] = i;
    }
    printf("%lld\n", f[n]);
    return 0;
}

303. 运输小猫

  • S S S 是农场主,他养了 M M M 只猫,雇了 P P P 位饲养员。农场中有一条笔直的路,路边有 N N N 座山,从 1 1 1 N N N 编号。第 i i i 座山与第 i − 1 i−1 i1 座山之间的距离为 D i D_i Di。饲养员都住在 1 1 1 号山。第 i i i 只猫去 H i H_i Hi 号山玩,玩到时刻 T i T_i Ti 停止,然后在原地等饲养员来接。饲养员在路上行走需要时间,速度为 1 米/单位时间。你的任务是规划每个饲养员从 1 号山出发的时间,使得所有猫等待时间的总和尽量小。饲养员出发的时间可以为负。

  • d d d 是前缀和, t t t 是结束时间,那么,对于第 i i i 只猫,只有饲养员在 t i − d i t_i - d_i tidi 之后出发才能接到这只猫。因此我们设 a i = t i − d i a_i = t_i - d_i ai=tidi,那么按照 a a a 排序,一位饲养员接一段连续子序列的小猫,那么相当于把这个子序列分为不超过 P P P 份,每位饲养员恰好接到当前子序列的最后一只小猫. 假设饲养员是 s i s_i si 出发的,恰好接到小猫 i i i,那么小猫等待时间就是 s i − a i . s_i - a_i. siai.

  • f ( j , i ) f(j, i) f(j,i) 为第 j j j 只饲养员接的最后一只小猫是 i i i. 上一个饲养员接的小猫是 k k k,那么 f ( j , i ) = min ⁡ { f ( j − 1 , k ) + a i ∗ ( i − k ) − ( s i − s k ) } f(j,i) = \min \{f(j - 1, k) + a_i * (i - k) - (s_i - s_k)\} f(j,i)=min{f(j1,k)+ai(ik)(sisk)}.

f ( j − 1 , k ) + s k = a i ∗ k + f ( j , i ) − a i ∗ i + s i f(j - 1,k) + s_k = a_i * k + f(j, i) - a_i * i + s_i f(j1,k)+sk=aik+f(j,i)aii+si.

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 100010, M = 100010, P = 110;

int n, m, p;
LL d[N], t[N], a[N], s[N];
LL f[P][M];
int q[M];

LL get_y(int k, int j)
{
    return f[j - 1][k] + s[k];
}

int main()
{
    scanf("%d%d%d", &n, &m, &p);

    for (int i = 2; i <= n; i ++ )
    {
        scanf("%lld", &d[i]);
        d[i] += d[i - 1];
    }

    for (int i = 1; i <= m; i ++ )
    {
        int h;
        scanf("%d%lld", &h, &t[i]);
        a[i] = t[i] - d[h];
    }

    sort(a + 1, a + m + 1);

    for (int i = 1; i <= m; i ++ ) s[i] = s[i - 1] + a[i];

    memset(f, 0x3f, sizeof f);
    for (int i = 0; i <= p; i ++ ) f[i][0] = 0;

    for (int j = 1; j <= p; j ++ )
    {
        int hh = 0, tt = 0;
        q[0] = 0;

        for (int i = 1; i <= m; i ++ )
        {
            while (hh < tt && (get_y(q[hh + 1], j) - get_y(q[hh], j)) <= a[i] * (q[hh + 1] - q[hh])) hh ++ ;
            int k = q[hh];
            f[j][i] = f[j - 1][k] - a[i] * k + s[k] + a[i] * i - s[i];
            while (hh < tt && (get_y(q[tt], j) - get_y(q[tt - 1], j)) * (i - q[tt]) >=
                (get_y(i, j) - get_y(q[tt], j)) * (q[tt] - q[tt - 1])) tt -- ;
            q[ ++ tt] = i;
        }
    }

    printf("%lld\n", f[p][m]);

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/128992/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

11. 基环树DP

359. 创世纪

12. 四边形不等式DP

13. 插头DP

14. 环形与后效性处理

15. 倍增优化 DP

16. 数据结构优化 DP

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

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

相关文章

接口自动化-让你了解数据库相关知识

目录 python接口自动化实战 数据库 写一个对数据库操作的类 python接口自动化实战 目标 学习数据库相关&#xff0c;用例增加对数据库校验 利用数据库完成对数据查询 如何校验数据库数据&#xff0c;怎样添加校验让程序自己校验&#xff08;充值、提现、投资接口对金额的…

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs)

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

分布式项目17 订单order,用dubbo来实现

说明&#xff1a;只要当一个订单生成时&#xff0c;处理订单的信息之外&#xff0c;还有订单中包含的订单商品数据以及订单物流信息&#xff0c;而订单的信息封装在“tb_order”表中&#xff0c;关于tb_order表结构如下图所示&#xff1a; 订单商品数据封装在“tb_order_item”…

STM32使用PWM实现led亮度变化

原理及代码讲解 1.序言2.频率3.占空比4.控制led亮度变化原理5.代码实例5.1 初始化引脚5.2 配置定时器15.3配置输出PWM 6.结语 1.序言 这里我以stm32F103c8te为例&#xff0c;讲解一下pwm如何输出&#xff0c; pwm又是如何控制led灯的亮度变化&#xff0c;以及具体代码又是 如何…

53、基于51单片机蓄电池充电器过充过放保护LCD液晶屏显示系统设计(程序+原理图+PCB源文件+参考论文+参考PPT+元器件清单等)

方案选择 单片机的选择 方案一&#xff1a;AT89C52是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&…

STL之Stack与queue的模拟实现与duque的底层结构(3千字长文详解)

STL之Stack与queue的模拟实现与duque的底层结构 文章目录 STL之Stack与queue的模拟实现与duque的底层结构设计模式的概念适配器模式 stack的实现queue的实现双端队列——dequedeque的底层结构 设计模式的概念 设计模式像是古代的兵法&#xff0c;是以前的人总结出来的一些在特定…

TClientDataSet 模拟 EXCEL表

日常处理数据时&#xff0c;经常需要&#xff0c;从EXCEL表格中&#xff0c;批量导入数据&#xff0c;通过 XLSReadWriteII编程&#xff0c;会很快导入。 但是&#xff0c;客户提供的EXCEL表的字段&#xff0c;数据格式&#xff0c;字段的排序&#xff0c;有很大的区别。因此&a…

PostmanScript脚本功能使用详解!

目录 前言&#xff1a; 一、Pre-requestScript 二、TestScript 三、随机参数&#xff1a; 前言&#xff1a; Postman 是一个强大的 API 工具&#xff0c;可以用于构建、测试和文档化 Web API。Postman 还提供了一个名为 PostmanScript 的功能&#xff0c;它可以用于自动化…

【5】Midjourney Prompt

Prompt 是Midjourney Bot解释以生成图像的简短文本短语。 Midjourney Bot将Prompt 中的单词和短语分解成为Token的较小部分&#xff0c;可以将其与训练数据进行比较&#xff0c;然后用于生成图像。 精心制作的 Prompt可以帮助生成独特且令人兴奋的图像。 Structure 结构 基本…

Spring Boot + Vue3前后端分离实战wiki知识库系统<八>--分类管理功能开发二

接着上一次Spring Boot Vue3 前后端分离 实战 wiki 知识库系统&#xff1c;七&#xff1e;--分类管理功能开发的分类功能继续完善。 分类编辑功能优化&#xff1a; 概述&#xff1a; 现在分类编辑时的界面长这样&#xff1a; 很明显目前的父分类的展现形式不太人性&#xf…

【JVM】JVM常用指令

文章目录 1、jps2、jinfo3、jstat4、jstack5、jmap6、jhat 1、jps jps&#xff08;java process status tool&#xff09;&#xff0c; 用于查看java进程及相关信息&#xff0c;如果你想找到一个java进程的pid&#xff0c;可以使用jps命令代替linux的ps命令。 命令格式&#…

ansible常见模块应用简介

目录 command, shell, raw模块file 模块copy 模块fetch 模块lineinfile模块unarchive解包解压缩 模块user 模块yum_repository 仓库管理yum/dnf模块Service/systemd模块firewalld 模块nmcli 模块get_url 模块mount模块 注意&#xff1a;该文档需要有 Linux 基础的看 command, s…

【架构基础】高内聚低耦合

软件设计目标&#xff1a;实现需求、易于重用、易于理解、没有冗余。 Dont reinvent the wheel, just realign it. --Anthony J D’ Angelo 高内聚低耦合&#xff0c;是软件工程中判断软件设计好坏的标准。主要评判模块或类的内聚性是否高&#xff0c;耦合度是否低。目的是使…

【图像处理】基于双目视觉的物体体积测量算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

TCP的安全和效率机制

目录 0.TCP协议格式 ​编辑 一.确认应答(安全机制) 二.超时重传(安全机制) 1.SYN丢包 2.ACK丢包 三.连接管理(安全机制) 1.三次握手建立连接 ​编辑 2.四次挥手断开连接 3.建立和断开连接 四.滑动窗口(效率机制) 五.流量控制(效率机制) 六.拥塞控制(安全机制) 七…

算法扩展第一次:收集雪花 【hash表,双指针,stl中的map】

算法详解 这道题需要新学的知识一个是双指针&#xff0c;一个是c库中的unordered_map容器 双指针 双指针原先我写过很多这方面的题&#xff0c;但是这道题我一开始是低估了它的难度&#xff0c;而且压根没有想到要用双指针&#xff0c;属于是长见识了&#xff0c;这道题的双…

Virtual box安装Ubuntu1804乱码

Virtual box安装Ubuntu1804乱码 1. 首先检查编码格式 运行以下命令打开locale配置文件&#xff1a; sudo nano /etc/default/locale2. 可能缺少字体&#xff0c;打开终端&#xff0c;先执行更新 sudo apt-get update 接着进入设置&#xff0c;搜索language&#xff0c;进入…

机器学习-搭建轻量级GPT2训练对话

在自己的机器上部署一个GPT简直太酷啦&#xff0c;因为模型数据缘故&#xff0c;所以这个机器人有时候傻傻的。。。 需要安装环境&#xff1a;python3.7 、Transformers4.2.0、pytorch1.7.0、nginx&#xff08;映射网页文件&#xff09; 我的系统&#xff1a;MAC m2 Mac默认是…

Jmeter如何安装jp@gc - Ultimate Thread Group插件(终极线程组)

首先明确一点&#xff0c;我们为什么要做压力测试&#xff1f; 压力测试是为了确保系统能够在负载高峰期和长时间运行的情况下保持高性能、稳定和可靠。同时也是软件开发生命周期中不可或缺的一环&#xff0c;帮助开发人员和系统管理员优化和调整系统&#xff0c;以提供卓越的…

2023春期末考试选择题R2-8计算最小生成树总权重详解

题目如图&#xff1a; 分析和计算&#xff1a; 题目给出一个图的邻接矩阵表示&#xff0c;要求求最小生成树的总开销。 根据Kruskal算法&#xff0c;根据邻接矩阵顶点连接情况&#xff0c;收集开销最小的边&#xff0c;直到所有顶点被收集&#xff0c;且无环路&#xff0c;即…