2-4基础算法-离散化/贪心/01背包问题

文章目录

  • 一.离散化
  • 二.贪心
  • 01背包问题

一.离散化

离散化是一种将数组的值域压缩,从而更加关注元素的大小关系的算法。
离散化数组要求内部有序(一般去重)
可以通过离散化下标得到值
也可以通过值得到离散化下标
在这里插入图片描述

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
	int a[6] = { 0,3,1000,2,99999,2 };//原数组
	vector<int> L;
	for (int i = 1; i < 6; i++) {
		L.push_back(a[i]);
	}
	sort(L.begin(), L.end());
	auto b=unique(L.begin(), L.end());
	L.erase(b, L.end());
	
	for (int i = 0; i < L.size(); i++) {
		cout << L[i]<<" ";  //2 3 1000 99999
	}
	//获取1000在L中的下标.lower_bound返回从左到右第一个大于等于1000 的地址
	cout << lower_bound(L.begin(), L.end(), 1000) - L.begin();  //2

二.贪心

1.最小化战斗力差距
在这里插入图片描述
在这里插入图片描述
评测系统

分析:先进行排序,从某个位置划分,左侧是a,右侧是b。则max a和min b是相邻的。只需计算相邻两数的差最小值

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
const int N = 1e5 + 5;
int main()
{
	int n;
	cin >> n;
	int a[N] = { 0 };
	int minnum = INT_MAX;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	sort(a, a + n);
	for (int i = 1; i < n; i++) {
		minnum = min(minnum, a[i] - a[i - 1]);
	}
	cout << minnum;
}

2.谈判
在这里插入图片描述
在这里插入图片描述
评测系统

分析:贪心:每次选择最小的两个部落合并

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e3 + 5;
int main()
{
	int n;
	cin >> n;
	int a[N] = { 0 };
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	sort(a, a + n);
	int sum = a[0];
	int sum2 = 0;
	int k = 1;
	while (k<n) {
		sum = sum + a[k++];
		sum2+=sum;
	}
	cout << sum2;
}

或优先队列

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main()
{
	int n;
	cin >> n;
	priority_queue<int, vector<int>, greater<int>> queue;//小根堆,最小元素放到前面
	for (int i = 0; i < n; ++i) {
		int x;
		cin >> x;
		queue.push(x);
	}
	int sum = 0;
	while (queue.size() > 1) {
		int x = queue.top();
		queue.pop();
		int y = queue.top();
		queue.pop();
		queue.push(x + y);
		sum += x + y;
	}
	cout << sum;
}

3.纪念品分组
在这里插入图片描述
在这里插入图片描述

评测系统

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
	int w, n;
	cin >> w >> n;
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	sort(a.begin(), a.end());
	int i = 0, j = n - 1;
	int sum = 0;
	while (i <= j) {
		if (a[i] + a[j] <= w) {
			i++;
			j--;
		}
		else {
			j--;
		}
		sum++;
	}
	cout << sum;
}

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
	int w, n;
	cin >> w >> n;
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	sort(a.begin(), a.end());
	int i = 0, j = n - 1;
	int sum = n;
	while (i < j) { //注意:这里不能写成i!=j,因为当ij相邻时,若满足if,ij交换,仍可以继续进行,直到越界
		if (a[i] + a[j] <= w) {
			i++;
			j--;
			sum--;
		}
		else {
			j--;
		}
	}
	cout << sum;
}

4.分糖果
在这里插入图片描述
解读:
①字典序:apple排在banana前面,我们认为apple的字典序更小
②假设我们有6个糖果分给3个学生,可能的分法是:ab、cd、ef,则拿到ef的同学字典序最大
③使得字典序最大的字符串尽可能小:指的是字典序最大的字符串的字典序最小,而不是长度最短(除非只有一个种类的糖果)。一种可能的分法中,字典序最大的是abccd;另一种分法中,字典序最大的是d。我们会选择abccd这种分法作为最终结果

分析:
糖果的种类数可能有三种情况
①只有一个种类的糖果:应使分的字典序最大的(分的糖果数最多的)同学拿到的糖果尽可能少(字符串尽可能小)。也就是尽可能的均分。如我们有7个糖果,分为3个同学。应该是2/2/3的分法
②一共有n个糖果,分给x个同学。我们先将输入序列s排序,现在同种类的糖放在了一起。若第x个糖果的种类和第1个糖果的种类不一样。 我们将前x个糖果依次分给x个同学,则第x个同学拿到了字典序最大的,又由于序列是有序的,x对应的字典序一定是当前最小的。从x+1到n(若有)的糖果我们将其分给第一位同学,因为第一位同学的首字母一定小于第x位同学,所以该操作不会产生影响。
③一共有n个糖果,分给x个同学。我们先将输入序列s排序,现在同种类的糖放在了一起。**若第x个糖果的种类和第1个糖果的种类一样。**这时,第x个糖果的字典序一定是最小的(因为已经排序),我们直接输出[x,n]即为最终序列。如:aaaabbbbcccc,4人,显然最佳分配a/a/a/abbbbcccc>其他分配abbb/a/a/accc

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
	int n, x;
	cin >> n >> x;
	vector<char> a(n + 1);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	sort(a.begin(), a.end());
	if (a[n] == a[1]) {
		if (n % x == 0) {
			int temp = n / x;
			while (temp--) {
				cout << a[1];
			}
		}
		else {
			int temp = n / x + 1;
			while (temp--) {
				cout << a[1];
			}
		}
	}
	else if (a[x] != a[1]) {
		cout << a[x];
	}
	else {
		for (int i = x; i <= n; i++) {
			cout << a[i];
		}
	}
	return 0;
}

5.最大的卡牌价值
在这里插入图片描述

评测系统

注:最多进行k次,并非一定要进行k次

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
struct pro {
	int a;
	int b;
};
bool cmp(const pro& x, const pro& y) {
	return x.b - x.a > y.b - y.a;
}
int main()
{
	int n, k;
	pro arr[N];
	cin >> n >> k;
	long long sum = 0;
	for (int i = 0; i < n; i++) {
		cin >> arr[i].a;
		sum += arr[i].a;
	}
	for (int i = 0; i < n; i++) {
		cin >> arr[i].b;
	}
	sort(arr, arr + n, cmp);
	for (int i = 0; i < n; i++) {
		if (k == 0) {
			break;
		}
		if (arr[i].b > arr[i].a) {
			sum -= arr[i].a;
			sum += arr[i].b;
			k--;
		}
	}
	cout << sum;
}
//也可以定义三个数组运算

6.珠宝的最大交替和
在这里插入图片描述
在这里插入图片描述
评测系统

分析:先求和,然后奇数位找最小的,偶数位找最大的,交换。

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int main()
{
	int n;
	cin >> n;
	vector<int> a(n);
	long long sum = 0;
	int ji=INT_MAX, ou=INT_MIN;
	for (int i = 0; i < n; i++) {
		cin >> a[i];
		if ( i % 2 == 0) {
			sum += abs(a[i]);
			ji = min(ji, abs(a[i]));
		}
		else {
			sum -= abs(a[i]);
			ou = max(ou, abs(a[i]));
		}
	}
	if(n>1&&ji<ou)
		sum = sum - 2 * ji + 2 * ou;
	cout << sum;
}

7.小蓝的礼物
在这里插入图片描述
在这里插入图片描述
评测系统

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <queue>
using namespace std;
int main()
{
	priority_queue<int, vector<int>, greater<int>> pq;
	int n, k;
	cin >> n >> k;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		pq.push(x);
	}
	long long sum = 0;
	int num = 0;
	while (pq.size() > 0) {
		int x = pq.top();
		sum += x;
		num++;
		if (sum > k) {
			sum -= x;
			if (x % 2 == 0) {
				if (sum + x/2 > k) {
					num--;
				}
			}
			else{
				if (sum + x/2+1 > k) {
					num--;
				}
			}
			cout << num;
			return 0;
		}
		pq.pop();
	}
	cout << num;
}

8.四个瓷瓶的神秘游戏

在这里插入图片描述

评测系统

分析:当一个瓶子为空的时候,我们依然可以继续操作。当两个瓶子都为空的时候,我们无法操作。

在通过sort排序后,满足a[0]<=a[1]<=a[2]<=a[3]。我们先通过操作将a[0]变为空,可操作次数为a[0]内的珍珠数。此时最后一个瓶内珍珠数最多,为a[3]+2*a[0]

在此基础上,对其他瓶进行处理
因为a[2]不小于a[1],所以能对a[1]进行的操作都可以对a[2]进行操作,我们假设a[2]和a[3]足够大。我们分别假设在a[0]为0时,a[1]分别取1~9,于是有:

在这里插入图片描述

以此类推,我们可以总结出

在这里插入图片描述

可以看出,相差模除为0时,a[1]和a[0]的差值就是a[3]要增加的值;差值模除为其他时,a[3]要增加的值为a[1]和a[0]的差值-1

于是有

#include <iostream>
#include <algorithm>
using namespace std;
int main() { 
    long long x; 
    long long a[4];
    for (int i = 0; i < 4; i++) {
        cin >> a[i];
    }
    sort(a, a + 4); 
    if ((a[1] - a[0]) % 3 == 0)
        cout << a[3] + (a[0] * 2) + a[1] - a[0];
    else
        cout << a[3] + (a[0] * 2) + a[1] - a[0]-1;
}

下面考虑a[3]或a[2]非足够大的情况,拥有最多珍珠的瓶子可能就不是a[3]:
在将a[0]变为0的基础上:
当瓶子内珍珠数为0111时,一次操作变为2000,此时瓶内最多珍珠数量为2,但按上述分析前两个瓶01时,a[3]数量不变,也就是1,和2差1
当瓶子内珍珠数为0112时,一次操作变为2001,此时瓶内最多珍珠数2,a[3]数量不变也正好是2,满足上述推理
当瓶子内珍珠数为0113时,一次操作变为2002,此时a[0]=2,a[3]数量不变为3,此时a[3]成为珍珠最多的瓶
当瓶子内珍珠数为0222时,一次操作变为4000,此时瓶内最多珍珠数4,但按上述分析前两个瓶02时,a[3]数量+1,也就是3,和4差1
以此类推
可以看出,当a[3]不是足够大时,或者说,a[3]如果不满足至少比a[2]或a[1]大1时,即a[1]、a[2]、a[3]相等时,a[0]反而成了珍珠最多的瓶
我们据此更新代码,考虑a[1]、a[2]、a[3]相等的情况,要在输出基础上+1

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
	long long a[4];
	for (int i = 0; i < 4; i++) {
		cin >> a[i];
	}
	sort(a, a + 4);

	int x = 0;
	if (a[3] == a[1]) {
		x = 1;
	}
	
	if ((a[1] - a[0]) % 3 == 0)
		cout << a[3] + (a[0] * 2) + a[1] - a[0]+x;
	else
		cout << a[3] + (a[0] * 2) + a[1] - a[0] - 1+x;
}

9.鸡哥的购物挑战
在这里插入图片描述
评测系统

分析:商品价格有正有负,计算过程中可抵消

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main() {
	priority_queue<int> pq;//大根堆
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		pq.push(x);
	}
	long long sum = 0;
	int num = 0;
	int laste;
	while (pq.size() > 0&&pq.top()>0) {
		sum += pq.top();
		laste = pq.top();//记录while最后一个弹出的元素
		pq.pop();
		num++;
	}
	if (num < n&& num % 2 != 0) {
		if (abs(pq.top()) > laste) {
			sum -= laste;
		}
		else {
			sum += pq.top();
		}
	}
	else if (num == n && num % 2 != 0) {
		sum -= laste;
	}
	cout << sum;
}

10.冒险者公会
在这里插入图片描述
在这里插入图片描述

评测系统

分析:样例说明有一定的误导性,为了更高效的派出冒险者,应该从小到大排序

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e3 + 5;
int cmp(const int a, const int b) {
	return a > b;
}
int main() {
	int m, n;
	cin >> m >> n;
	int x[N] = { 0 }, b[N][N] = { 0 };
	for (int i = 0; i < m; i++) {
		cin >> x[i];
	}
	sort(x, x + m,cmp);
	int maxnum = -1;
	for (int i = 0; i < n; i++) {
		int k;
		cin >> k;
		for (int j = 0; j < k; j++) {
			cin >> b[i][j];
		}
		sort(b[i], b[i] + k,cmp);
		maxnum = max(maxnum, k);
	}
	if (m < maxnum) {
		cout << "-1";
		return 0;
	}
	int temp[N] = { -1 };//存储每轮的最大值
	int num = 0;
	for (int i = 0; i < maxnum; i++) {
		for (int j = 0; j < n; j++) {
			temp[num] = max(b[j][i], temp[num]);
		}
		num++;
	}
	int sum = 0;
	num = m-1;
	int num2 = maxnum - 1;
	while (num!=-1&&num2!=-1) {
		if (x[num] < temp[num2]) {
			num--;
		}
		else {
			sum += x[num];
			num--;
			num2--;
		}
	}
	if (num2 == -1)
		cout << sum;
	else
		cout << "-1";
}

11.明日方舟大作战!
在这里插入图片描述
在这里插入图片描述

评测系统

分析:在一轮中所有队员均可上场;对每个队员至多需要一次付费

引入:

01背包问题

对于一系列物品,每个物品有两个属性,价值v[i]和重量w[i];一个背包,它有一个最大承重限制W。在0-1背包问题中,每个物品只有两种状态:被选中和未被选中,这就是"0-1"的由来。不同于分数背包问题,我们不能选择物品的一部分,而必须决定是否完整地取用每个物品。0-1背包问题通常通过动态规划来解决。基本思想是使用一个二维数组dp[i][j]来表示当考虑到前i个物品,且背包容量为j时所能得到的最大价值。
我们的目标是选择一些物品装入背包,使得这些物品的总价值最大化,同时保证这些物品的总重量不超过背包的承重限制。

在这里插入图片描述
物品(重量w,价值v)
第0行:不考虑任何物品,背包的最大价值为0
第0列:当背包重量为0时,无法放入任何物品,最大价值为0
表格中的每个数字都表示:当考虑前i个物品时,在背包重量j下,能获得的最大价值

在这里插入图片描述
对于[1,1]
背包容量为1,1号物品重量为2,无法放入背包。
即当前物品重量大于背包容量,则背包价值与不放当前物品的价值一致(与只考虑前i-1个物品一致)

if(weight[i]>j){
	dp[i][j]=dp[i-1][j]
}

在这里插入图片描述

对于[2,3]
当前物品重量为3≤当前背包容量3,允许放入
判断放入后是否能获得更大价值:max(不放入,放入)
若不放入:背包的最大价值=在同样的背包容量j下,能获得的最大价值,即dp[i-1][j]
若放入:背包内物品的总重量一定已经加上了当前物品的重量和价值,我们找到"不考虑当前物品的价值"和“减去当前物品重量”对应的最优值,再加上当前物品的价值,即可得到结果,即dp[i-1][j-weight[i]]+value[i]

if(weight[i]<=j){
	dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);
}

对于另一个例子,我们给出完整的代码(注:weight和value数组下标从1开始存放数据,0号索引填充0)
这里使用vector表示,也可使用数组

#include <iostream>
#include <vector>
using namespace std;
int knapsack(int W, const vector<int> weight, const vector<int> value) {
	int n = weight.size()-1;
	//使用vector<vector<int>>创建二维数组
	//外层(行)有n + 1个元素(向量)
	//对于每个外层元素都有W+1个内层元素(列),并将它们初始化为0
	vector<vector<int>> dp(n + 1, vector<int>(W + 1, 0));
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= W; j++) {
			if (weight[i] <= j) { 
				dp[i][j] = max(dp[i-1][j], dp[i - 1][j - weight[i]] + value[i]);
			}
			else {
				dp[i][j] = dp[i - 1][j];
			}
		}
	}
	return dp[n][W];
}
int main() {
	int W = 10;//背包最大容量
	vector<int> weight = { 0,1,2,4,2,5 };//每个物品的重量
	vector<int> value = { 0,5,3,5,3,2 };//每个物品的价值
	cout << knapsack(W, weight, value);//在不超过背包承重限制的条件下,所能选择物品的最大总价值。
}

下面我们再看一个一维dp的例子
一维dp每次迭代只保留上一个物品计算的结果,减少了对空间的需求,空间复杂度有所降低。如果问题只要求最大价值而不需要具体的物品列表,一维DP是更好的选择。如果需要知道具体哪些物品被选中,则可能需要额外的逻辑或记录。二维dp可以具体到每个物品和每种容量下的最大价值。

若背包容量10,共有4件物品,(重量,价值)分别为(2,1),(3,3),(4,5),(7,9)

在这里插入图片描述
在这里插入图片描述

处理第一个物品:从右往左填写。第一个物品重量2<10,允许放入,直到j=2。检查价值最大化。

for (int j = W; j >= weight[i]; j--) { //逆序保证了在更新时用到的dp仍然是上一轮(没有考虑当前物品)的结果
	dp[j] = max(dp[j], dp[j - weight[0]] + value[0]);
}

处理第二个物品:j=10前两件物品均可放入

在这里插入图片描述

j=4时
若不放入当前物品,dp[j]=1
若放入当前物品,在减去当前重量的情况下决策dp[j - weight[1]] + value[1]=0+3=3

for (int j = W; j >= weight[i]; j--) {
	dp[j] = max(dp[j], dp[j - weight[1]] + value[1]);
}

在这里插入图片描述
以此类推,遍历完所有i得到的dp[10]即为结果

对于另一个例子,我们给出完整的代码(注:weight和value数组下标从0开始存放数据),j是逆序的
这里使用vector表示,也可使用数组

#include <iostream>
#include <vector>
using namespace std;

int knapsack(int W, const vector<int> weight, const vector<int> value) {
    int n = weight.size();
    vector<int> dp(W + 1, 0);

    for (int i = 0; i < n; i++) {
        for (int j = W; j >= weight[i]; j--) { //逆序保证了在更新时用到的dp仍然是上一轮(没有考虑当前物品)的结果
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
            //max中的dp[j]表示在不加入当前物品i的情况下,物品能达到的最大价值。
            //类似于在二维的基础上去掉了第一个维度
            //dp[i][j] = max(dp[i-1][j], dp[i - 1][j - weight[i]] + value[i]);
        }
    }

    return dp[W];
}

int main() {
    int W = 10; 
    vector<int> weight = { 1, 2, 4, 2, 5 };
    vector<int> value = { 5, 3, 5, 3, 2 };

    cout << knapsack(W, weight, value);
    return 0;
}

【回到题目】我们使用01背包一维dp找到最大的攻击力,再找到最多血量的敌人,即可计算最小的回合数

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
int knapsack(int B, const vector<int> attack, const vector<int> cost) {
	vector<int> dp(B + 1, 0);//dp数组记录总费用为j时可获得的最大攻击力
	int n = attack.size();
	for (int i = 0; i < n; i++) {
		for (int j = B; j >= cost[i]; j--) {
			dp[j] = max(dp[j], dp[j - cost[i]] + attack[i]);//是否选择i
		}
	}
	return dp[B];
}
int main() {
	int n, m, B;
	cin >> n >> m >> B;
	vector<int> attack(n), cost(n);
	for (int i = 0; i < n; i++) {
		cin >> attack[i] >> cost[i];
	}

	int max_attack = knapsack(B,attack,cost);//01背包调用

	int max_life = 0;//敌人的最大生命值
	for (int i = 0; i < m; i++) {
		int life;
		cin >> life;
		max_life = max(life, max_life);
	}

	if (max_attack == 0) {
		cout << "-1";
		return 0;
	}
	//使用ceil向上取值,头文件#include <cmath>
	int rounds = (int)ceil((double)max_life / max_attack);
	cout << rounds;
	//也可使用:max_life% max_attack == 0 ? cout << max_life / max_attack : cout << max_life / max_attack + 1;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图灵日记之java奇妙历险记--继承和多态

目录 继承概念继承语法父类成员访问子类中访问父类的成员变量子类中访问父类的成员方法 super关键字子类构造方法super和this初始化protected关键字继承方式final 关键字继承与组合 多态条件向上转型重写动态绑定&&静态绑定多态再理解向下转型多态的优缺点好处缺陷 继承…

【逗老师的无线电】ICOM IC-705终端模式Terminal Mode直连反射器配置-外置Pi-Star网关篇

各位友台大家好呀&#xff0c;逗老师最近整了一台IC-705&#xff0c;最吸引人的莫过于这玩意可以通过USB连接树莓派直接进行通联。下面简单介绍一下这个功能和其配置方法 一、功能 终端模式Terminal Mode允许IC-705电台作为终端直接连接反射器&#xff0c;基于不同的连接方式…

C/C++学习笔记十三 C++中的重载运算符

1、什么是运算符重载&#xff1f; 运算符重载是 C 中的一项功能&#xff0c;使运算符&#xff08;例如 、- 等&#xff09;能够处理用户定义的数据类型。这种机制称为编译时多态性&#xff0c;并提供了为不同数据类型定制运算符行为的优点。 例如&#xff0c;我们可以重载“”运…

八皇后问题(C语言)

了解题意 在一个8x8的棋盘上放置8个皇后&#xff0c;使得任何两个皇后都不能处于同一行、同一列或同一斜线上。问有多少种方法可以放置这8个皇后&#xff1f; 解决这个问题的目标是找到所有符合要求的皇后摆放方式&#xff0c;通常使用回溯算法来求解。回溯算法会尝试所有可能…

网格布局(大练习)

最近对网格布局研究了一下&#xff0c;写了一个简单的demo。可以参考参考~ 网格基础布局&#xff1a;github地址 挤占网格布局&#xff1a;github地址 基础网站格局&#xff1a;github地址 复杂网站格局&#xff08;方式一&#xff09;&#xff1a;github地址 复杂网站格局&am…

1.Linux快速入门

Linux快速入门 Linux操作系统简介Linux操作系统优点Linux操作系统发行版1. Red Hat Linux2. CentOS3. Ubuntu4. SUSE Linux5. Fedora Linux 32位与64位操作系统的区别Linux内核命名规则 Linux操作系统简介 Linux操作系统是基于UNIX以网络为核心的设计思想&#xff0c;是一个性…

X210 Linux开发板挂载NFS文件系统

网络搭建 采用“路由器”“有线网”来将Linux开发板和Ubuntu虚拟机连接在同一个局域网中。具体接线如下&#xff1a; Linux开发板通过网线直接连接到“路由器”的LAN接口上&#xff0c;然后笔记本电脑通过Wifi与路由器连接。 VirtualBox虚拟机网络设置 在”网线“设置界面中…

1.S32K3电源和复位

一、电源 S32K3系列芯片的电源各不相同。以S32K34x&#xff0c;S32K32x及S32K314为例。 并且该芯片支持以下特性&#xff1a; • Combination of internal and external voltage regulator options, offering RUN and Standby modes • FPM , which is used on chip-level in…

Flood Fill算法总结

算法思想 从一个起点开始&#xff0c;每一次随机选择一个新加进来的格子&#xff0c;看一下它周围能否扩展新的格子。如果能扩展&#xff0c;那么就扩展进来&#xff0c;直到不能扩展新的格子为止。当然需要判重&#xff0c;同样一个格子只能覆盖一次&#xff0c;这样能够保证时…

JVM工作原理与实战(二):字节码编辑器jclasslib

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、字节码编辑器jclasslib介绍和安装 1.介绍 2.安装 3.IntelliJ IDEA 插件安装 二、字节码编辑器jclasslib的使用 1.使用jclasslib bytecode viewer打开字节码文件 2.使用Intell…

gitLab页面打tag操作步骤

作者&#xff1a;moical 链接&#xff1a;gitLab页面打tag简单使用 - 掘金 (juejin.cn) 来源&#xff1a;稀土掘金 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 ---------------------------------------------------------------------…

对I2C总线上挂接多个AT24C02的读写操作

#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ1 0xa1 // 器件1地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE1 0xa0 // 器件1地址以…

python文件打包实战技巧

众所周知&#xff0c;python是一种脚本语言&#xff0c;python程序必须在python环境下运行&#xff0c;所以如果想把自己写的程序给别人看的话&#xff0c;就比较麻烦&#xff0c;他需要先配置python环境&#xff0c;对于电脑小白来说这是“要命”的事情。而且如果是客户的话&a…

ubuntu多用户环境dockerbug,卸载重装docker流程

之前不小心误操作删除重装docker&#xff0c;结果删除没成功&#xff0c;更没法重装&#xff0c;每次apt install都会报一个docker错误&#xff0c;虽然不影响软件的常规安装&#xff5e;但是现在还是需要装一个完整docker&#xff0c;还是选择删除一下&#xff0c;重点是关闭服…

多环境及SpringBoot项目部署

1、多环境 2、项目部署上线 原始前端 / 后端项目宝塔Linux容器容器平台 3、前后端联调 4、项目扩展和规划 多环境 程序员鱼皮-参考文章 本地开发&#xff1a;localhost&#xff08;127.0.0.1&#xff09; 多环境&#xff1a;指同一套项目代码在把不同的阶段需要根据实际…

共享单车之数据可视化

文章目录 第1关&#xff1a;绘制地图第2关&#xff1a;绘制流量最高的五条线路的路程图 第1关&#xff1a;绘制地图 任务描述 本关任务&#xff1a;使用JSP在百度地图上绘制一条共享单车起始路程。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 如何创建地…

macos下转换.dmg文件为 .iso .cdr文件的简单方法

为了让镜像文件在mac 和windows平台通用, 所以需要将.dmg格式的镜像文件转换为.iso文件, 转换方法也非常简单, 一行命令即可 hdiutil convert /path/to/example.dmg -format UDTO -o /path/to/example.iso 转换完成后的文件名称默认是 example.iso.cdr 这里直接将.cdr后缀删…

web一些实验代码—— JavaBean与EL标签

实验9&#xff1a; JavaBean与EL标签 使用javaBean和EL&#xff0c;完成注册和注册信息显示。 1、新建RegisterBean&#xff1b; package com.example.weeebbbb.the10;public class RegisterBean {private String user;private String pass;private String repass;private S…

【Transformer】深入理解Transformer模型2——深入认识理解(上)

前言 Transformer模型出自论文&#xff1a;《Attention is All You Need》 2017年 近年来&#xff0c;在自然语言处理领域和图像处理领域&#xff0c;Transformer模型都受到了极为广泛的关注&#xff0c;很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

OCR在审核应用落地

本文字数&#xff1a;6686字 预计阅读时间&#xff1a;35分钟 01 背景 1、业务背景 在传统视频审核场景中&#xff0c;审核人员需要对进审视频中的文字内容进行逐一审核&#xff0c;避免在文字上出现敏感词、违禁词或者广告等相关词汇。这种人工审核费时费力&#xff0c;并且由…