【数学 逆序对 构造】P12386 [蓝桥杯 2023 省 Python B] 混乱的数组|普及+

news2025/6/5 4:47:57

本文涉及知识点

数学 构造

P12386 [蓝桥杯 2023 省 Python B] 混乱的数组

题目描述

给定一个正整数 x x x,请找出一个尽可能短的仅含正整数的数组 A A A 使得 A A A 中恰好有 x x x i , j i, j i,j 满足 i < j i < j i<j A i > A j A_i > A_j Ai>Aj

如果存在多个这样的数组,请输出字典序最小的那个。

输入格式

输入一行包含一个整数表示 x x x

输出格式

输出两行。

第一行包含一个整数 n n n,表示所求出的数组长度。

第二行包含 n n n 个整数 A i A_i Ai,相邻整数之间使用一个空格分隔,依次表示数组中的每个数。

输入输出样例 #1

输入 #1

3

输出 #1

3
3 2 1

说明/提示

评测用例规模与约定

  • 对于 30 % 30\% 30% 的评测用例, x ≤ 10 x \leq 10 x10
  • 对于 60 % 60\% 60% 的评测用例, x ≤ 100 x \leq 100 x100
  • 对于所有评测用例, 1 ≤ x ≤ 10 9 1 \leq x \leq 10^9 1x109

数量 逆序对

性质一:长度为n的数组,逆序最多 m n = n × ( n − 1 ) 2 mn=\frac{n \times (n-1)}{2} mn=2n×(n1),整个数组逆序。 m n 0 = 0 , m n i = m n i − 1 + n − 1 mn_0=0,mn_i=mn_{i-1}+n-1 mn0=0,mni=mni1+n1
性质二:存在逆序对(i,j),则一定存在相邻逆序对。如果{i,i+1},{i+1,i+2} ⋯ \cdots {j-1,j}都不是逆序对,则(i,j)也不是逆序对。
性质三:1到n排列,通过调整顺序,可以让逆序对为[0,mn]的任意数。选择任意相邻逆序对交换,逆序对减1。
性质四:长度为n的数字,x1是A[0]和其它数字的逆序对数量;x2是A[1…n-1]之间的逆序对数量。x2一定是 ( n − 1 ) × ( n − 1 ) 2 \frac{(n-1)\times (n-1)}{2} 2(n1)×(n1)
A[0]=A[1…N-1]最小的x1个数的最大值+1。 x2++,有如下方式:a,交换顺序。b,某个数变小。c,某个数变大。x2++,意味着x1–。
无论那种方式A[0]只会变小或不变,不会变大。故A[1…N-1] 是N-1到1的逆序。
通过i从0到N-1枚举A[i],A[0…i-1]已经确定, A[i+1…] 是[1,N-i+1]的逆序。

细节

数组分三部分
前缀A[0…i-1]:内部的逆序对直接从x减掉。cnt[i]记录前缀中大于等于i的数量
当前A[i]。
后缀:一定是 r e m a i n ∼ 1 remain \sim 1 remain1,remain=len-i-1
presum记录前后缀简单的逆序对。先暴力枚举,再优化。
枚举A[i]的值。
时间复杂度:O(nnn)

性质优化

l e n ≈ x len \approx \sqrt x lenx
cnt[i]记录前缀中大于等于i的数量。对应差分数组是diff。则A[i]选择为x,则cnt[x…len]++,即diff[x]++。
这样可以在 log ⁡ l e n \log len loglen的时间内,区间修改cnt,单点查询。cnt[cur+1]就是当前值选择cur,当前和前缀的逆序对。
[1…remain]和前缀构成的逆序对数量:
cnt2[i] = cnt[i]*i
则后缀和前缀组成的逆序对:
c n t 2 [ c u r + 1.... ] − c n t [ c u r + 1... ] ∗ c u r cnt2[cur+1....]-cnt[cur+1...]*cur cnt2[cur+1....]cnt[cur+1...]cur
cnt2也用树状数组实现。
时间复杂度 O ( l e n l o g l e n l o g l e n ) O(len loglen loglen) O(lenloglenloglen)

此算法错误

以上性质,只有 i = = 0 i==0 i==0是成立。比如:111111?11 优化111111?21

新解法

性质一 A [ 0 ] ≠ 1 A[0]\neq1 A[0]=1,否则A[0]为0,不会和任意数产生逆序对。直接删除,更短。
** 性质二**:如果 A [ i ] ≥ A [ i + 1 ] A[i] \ge A[i+1] A[i]A[i+1]则所有 A [ j ] ≤ A [ j + 1 ] , i + 1 < j A[j] \le A[j+1],i+1<j A[j]A[j+1],i+1<j。假定 A [ i 1 ] ≤ A [ i 1 + 1 ] A[i1]\le A[i1+1] A[i1]A[i1+1]不会成立。则交换 A [ i ] , s [ i + 1 ] A[i],s[i+1] A[i],s[i+1]逆序减1,交换A[j]和s[j+1]逆序对+1 。逆序对不变,字典序变小。
性质三 s [ i ] > s [ i + 1 ] < s [ i + 2 ] s[i]> s[i+1] < s[i+2] s[i]>s[i+1]<s[i+2]不成立。
情况a:a[i] > s[i+2]。如:312。321,逆序对++;231,逆序对–。逆序数不变,字典序更小。
情况b,a[i] < s[i+2]。如:213。123,逆序对–。132,逆序对++。逆序数不变,字典序更小。
情况c, s [ i ] = = s [ i + 2 ] s[i]==s[i+2] s[i]==s[i+2]如:212。 ????待证。
结论一:如果s[i]<s[i+1],s[0…i]严格不减。
性质四 A [ 0 ] < A [ 1 ] < A [ 2 ] A[0] <A[1] <A[2] A[0]<A[1]<A[2]

正确解法

从新开始。
性质一:长度为n的数组,逆序最多 m n = n × ( n − 1 ) 2 mn=\frac{n \times (n-1)}{2} mn=2n×(n1),整个数组逆序。 m n 0 = 0 , m n i = m n i − 1 + n − 1 mn_0=0,mn_i=mn_{i-1}+n-1 mn0=0,mni=mni1+n1
性质二:存在逆序对(i,j),则一定存在相邻逆序对。如果{i,i+1},{i+1,i+2} ⋯ \cdots {j-1,j}都不是逆序对,则(i,j)也不是逆序对。
用f(i)代替 m m i mm_i mmi
求最小f(n) >= x。
性质三:如果 x = = f ( n ) x == f(n) x==f(n)。1到n的全排列逆序。
性质四:无论是否有重复的数字,逆序能得到最多的逆序对。存在一组重复2次的数字,逆序数减1。一组重复3次的数组,逆序对减少3。存在一组重复m次的数字,逆序对减少m-1次。
性质五 f ( n ) − f ( n − 1 ) = n − 1 f(n)-f(n-1)=n-1 f(n)f(n1)=n1我们以f(n)为基础,减少y=f(n)-x。 x ≥ f ( n − 1 ) ,故 y ∈ [ 0 , n − 2 ] x \ge f(n-1),故y\in[0,n-2] xf(n1),故y[0,n2]
A [ 0 ] ≥ n − y A[0] \ge n-y A[0]ny 小于此值逆序对小于x。降低A[i]的值到<A[0],(A[0],A[i])成为新逆序对。根根据性质四,A[1…n]的逆序对减1。
推论:A降序,如果 A [ i ] = = A [ i − 1 ] , A [ i − 1 ] ≠ A [ i − 2 ] A[i]==A[i-1],A[i-1]\neq A[i-2] A[i]==A[i1]A[i1]=A[i2]可以将A[i]赋值为A[i-2],逆序对不变。字典序变小。

x=10为例:5 4 3 2 1。
x=9:4 3 2 1 1,逆序对减1。
x=8:3 2 2 1 1,逆序对减1。
如果n是奇数,可以减少 ⌊ n / 2 ⌋ \lfloor n/2 \rfloor n/2
如果是偶数,可以减少 n / 2 n/2 n/2
以x=15为例:
654321 → 543211 → 432211 → 332211 654321\rightarrow 543211 \rightarrow 432211 \rightarrow332211 654321543211432211332211
性质六: x > g e ⌊ n / 2 ⌋ \large x >ge \lfloor n/2 \rfloor x>gen/2
x = 23为例。
24: 4 4 3 3 2 2 1 1
将A[0]改成3,变成 34332211 3 4 3 3 2 2 11 34332211
3 4 3 3 ,逆序对减少2。A[1…n]已经是逆序,无法通过调整顺序增加逆序,只能减少重复数字。即:3433变成543。
即:**:23: 3 5 4 3 2 2 1 1
分析:x = 22
A[0]改成2,后面的2个2重复,减少2个逆序对。增加一个逆序只能:
5432全部+1,减少一个重复。
总结
A [ 0 ] = n − ( f ( n ) − x ) , f ( n ) − x 的取值范围 [ 0 , n − 2 ] A[0]=n-(f(n)-x),f(n)-x的取值范围[0,n-2] A[0]=n(f(n)x),f(n)x的取值范围[0,n2] A [ 0 ] 的取值范围 n ∼ 2 A[0]的取值范围n \sim 2 A[0]的取值范围n2
如果 A [ 0 ] ≥ n 2 , y = n − A [ 0 ] A[0]\ge \frac n 2,y=n -A[0] A[0]2n,y=nA[0]从后到前, 2 个 1 , 2 个 2 ⋯ 2 个 y 2个1,2个2\cdots 2个y 21222y 1 个 y + 1 , 1 个 y + 2 ⋯ A [ 0 ] 1个y+1,1个y+2 \cdots A[0] 1y+1,1y+2A[0]
否则, 2 个 A [ 0 ] 2 个 A [ 0 ] − 1 ⋯ 2 个 1 ,令 z = n − 2 A [ 0 ] 否则,2个A[0] 2个A[0]-1\cdots 2个1,令z = n - 2A[0] 否则,2A[0]2A[0]121,令z=n2A[0]两个A[0]之间插入 A [ 0 ] + z , A [ 0 ] + z − 1 ⋯ A [ 0 ] + 1 A[0]+z,A[0]+z-1 \cdots A[0]+1 A[0]+z,A[0]+z1A[0]+1

代码

核心代码

#include <iostream>
#include <sstream>
#include <vector>
#include<map>
#include<unordered_map>
#include<set>
#include<unordered_set>
#include<string>
#include<algorithm>
#include<functional>
#include<queue>
#include <stack>
#include<iomanip>
#include<numeric>
#include <math.h>
#include <climits>
#include<assert.h>
#include<cstring>
#include<list>
#include<array>

#include <bitset>
using namespace std;

template<class T1, class T2>
std::istream& operator >> (std::istream& in, pair<T1, T2>& pr) {
	in >> pr.first >> pr.second;
	return in;
}

template<class T1, class T2, class T3 >
std::istream& operator >> (std::istream& in, tuple<T1, T2, T3>& t) {
	in >> get<0>(t) >> get<1>(t) >> get<2>(t);
	return in;
}

template<class T1, class T2, class T3, class T4 >
std::istream& operator >> (std::istream& in, tuple<T1, T2, T3, T4>& t) {
	in >> get<0>(t) >> get<1>(t) >> get<2>(t) >> get<3>(t);
	return in;
}

template<class T1, class T2, class T3, class T4, class T5, class T6, class T7 >
std::istream& operator >> (std::istream& in, tuple<T1, T2, T3, T4,T5,T6,T7>& t) {
	in >> get<0>(t) >> get<1>(t) >> get<2>(t) >> get<3>(t) >> get<4>(t) >> get<5>(t) >> get<6>(t);
	return in;
}

template<class T = int>
vector<T> Read() {
	int n;
	cin >> n;
	vector<T> ret(n);
	for (int i = 0; i < n; i++) {
		cin >> ret[i];
	}
	return ret;
}
template<class T = int>
vector<T> ReadNotNum() {
	vector<T> ret;
	T tmp;
	while (cin >> tmp) {
		ret.emplace_back(tmp);
		if ('\n' == cin.get()) { break; }
	}
	return ret;
}

template<class T = int>
vector<T> Read(int n) {
	vector<T> ret(n);
	for (int i = 0; i < n; i++) {
		cin >> ret[i];
	}
	return ret;
}

template<int N = 1'000'000>
class COutBuff
{
public:
	COutBuff() {
		m_p = puffer;
	}
	template<class T>
	void write(T x) {
		int num[28], sp = 0;
		if (x < 0)
			*m_p++ = '-', x = -x;

		if (!x)
			*m_p++ = 48;

		while (x)
			num[++sp] = x % 10, x /= 10;

		while (sp)
			*m_p++ = num[sp--] + 48;
		AuotToFile();
	}
	void writestr(const char* sz) {
		strcpy(m_p, sz);
		m_p += strlen(sz);
		AuotToFile();
	}
	inline void write(char ch)
	{
		*m_p++ = ch;
		AuotToFile();
	}
	inline void ToFile() {
		fwrite(puffer, 1, m_p - puffer, stdout);
		m_p = puffer;
	}
	~COutBuff() {
		ToFile();
	}
private:
	inline void AuotToFile() {
		if (m_p - puffer > N - 100) {
			ToFile();
		}
	}
	char  puffer[N], * m_p;
};

template<int N = 1'000'000>
class CInBuff
{
public:
	inline CInBuff() {}
	inline CInBuff<N>& operator>>(char& ch) {
		FileToBuf();
		while (('\r' == *S) || ('\n' == *S) || (' ' == *S)) { S++; }//忽略空格和回车
		ch = *S++;
		return *this;
	}
	inline CInBuff<N>& operator>>(int& val) {
		FileToBuf();
		int x(0), f(0);
		while (!isdigit(*S))
			f |= (*S++ == '-');
		while (isdigit(*S))
			x = (x << 1) + (x << 3) + (*S++ ^ 48);
		val = f ? -x : x; S++;//忽略空格换行		
		return *this;
	}
	inline CInBuff& operator>>(long long& val) {
		FileToBuf();
		long long x(0); int f(0);
		while (!isdigit(*S))
			f |= (*S++ == '-');
		while (isdigit(*S))
			x = (x << 1) + (x << 3) + (*S++ ^ 48);
		val = f ? -x : x; S++;//忽略空格换行
		return *this;
	}
	template<class T1, class T2>
	inline CInBuff& operator>>(pair<T1, T2>& val) {
		*this >> val.first >> val.second;
		return *this;
	}
	template<class T1, class T2, class T3>
	inline CInBuff& operator>>(tuple<T1, T2, T3>& val) {
		*this >> get<0>(val) >> get<1>(val) >> get<2>(val);
		return *this;
	}
	template<class T1, class T2, class T3, class T4>
	inline CInBuff& operator>>(tuple<T1, T2, T3, T4>& val) {
		*this >> get<0>(val) >> get<1>(val) >> get<2>(val) >> get<3>(val);
		return *this;
	}
	template<class T = int>
	inline CInBuff& operator>>(vector<T>& val) {
		int n;
		*this >> n;
		val.resize(n);
		for (int i = 0; i < n; i++) {
			*this >> val[i];
		}
		return *this;
	}
	template<class T = int>
	vector<T> Read(int n) {
		vector<T> ret(n);
		for (int i = 0; i < n; i++) {
			*this >> ret[i];
		}
		return ret;
	}
	template<class T = int>
	vector<T> Read() {
		vector<T> ret;
		*this >> ret;
		return ret;
	}
private:
	inline void FileToBuf() {
		const int canRead = m_iWritePos - (S - buffer);
		if (canRead >= 100) { return; }
		if (m_bFinish) { return; }
		for (int i = 0; i < canRead; i++)
		{
			buffer[i] = S[i];//memcpy出错			
		}
		m_iWritePos = canRead;
		buffer[m_iWritePos] = 0;
		S = buffer;
		int readCnt = fread(buffer + m_iWritePos, 1, N - m_iWritePos, stdin);
		if (readCnt <= 0) { m_bFinish = true; return; }
		m_iWritePos += readCnt;
		buffer[m_iWritePos] = 0;
		S = buffer;
	}
	int m_iWritePos = 0; bool m_bFinish = false;
	char buffer[N + 10], * S = buffer;
};

class Solution {
public:
	vector<int> Ans(int x) {
		vector<int> mn(1);
		while (mn.back() < x) {
			mn.emplace_back(mn.size() - 1 + mn.back());
		}
		const int len = mn.size() - 1;
		int  y = mn.back() - x;
		vector<int> ans;
		int a0 = len - y;
		if (2 * a0 >= len) {
			for (int i = a0; i > 0; i--) {
				ans.emplace_back(i);
				if (i <= len - a0) {
					ans.emplace_back(i);
				}
			}
		}
		else {
			for (int i = a0; i > 0; i--) {
				ans.emplace_back(i);
				ans.emplace_back(i);
			}
			vector<int> tmp;
			for (int i = len - 2 * a0; i > 0; i--) {
				tmp.emplace_back(a0 + i);
			}
			ans.insert(ans.begin() + 1, tmp.begin(), tmp.end());
		}
		return ans;
	}
};

int main() {
#ifdef _DEBUG
	freopen("a.in", "r", stdin);
#endif // DEBUG	
	ios::sync_with_stdio(0); cin.tie(nullptr);
	//CInBuff<> in; COutBuff<10'000'000> ob;	
	/*for (int x = 1; x <= 28; x++) {
		cout << x << ":";
		auto res = Solution().Ans(x);
		for (const auto& i : res) {
			cout << i << " ";
		}
		cout << "\n";
	}*/
	int x;
	cin >> x;
#ifdef _DEBUG	
		//printf("iH=%d,iA=%d,H=%d,dA=%d",iH,iA,H,dA);
		//Out(C, ",C=");
		//Out(edge, ",edge=");		
		/*Out(que, ",que=");*/
	   //Out(ab, ",ab=");
	   //Out(par, "par=");
	   //Out(que, "que=");
	   //Out(B, "B=");
#endif // DEBUG	
	auto res = Solution().Ans(x);
	cout << res.size() << "\n";
	for (const auto& i : res) { cout << i << " "; }
	return 0;
};

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

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

相关文章

Excel 批量下载PDF、批量下载考勤图片——仙盟创梦IDE

在办公场景中&#xff0c;借助应用软件实现 Excel 批量处理考勤图片、电子文档与 PDF&#xff0c;具有诸多显著优势。 从考勤图片处理来看&#xff0c;通过 Excel 批量操作&#xff0c;能快速提取图片中的考勤信息&#xff0c;如员工打卡时间、面部识别数据等&#xff0c;节省…

PCIe-Error Detection(一)

下表为PCIe协议中给出的错误&#xff1a; 一、可纠正错误&#xff08;Correctable Errors&#xff0c;8种&#xff09;​​ ​​检错机制​​ ​​错误名称​​​​检测层级​​​​触发条件​​​​Receiver Error​​Physical接收端均衡器&#xff08;EQ&#xff09;监测到…

向量空间的练习题目

1.考虑 中的向量x1 和x2 求每一向量的长度 令x3x1x2,求x3的长度&#xff0c;它的长度与x1和x2的和有什么关系&#xff1f; 2.重复练习1&#xff0c;取向量 3.令C为复数集合&#xff0c;定义C上的加法为 (abi)(cdi)(ac)(bd)i 并定义标量乘法为对所有实数a (abi) a bi 证明&…

Leetcode 2123. 使矩阵中的 1 互不相邻的最小操作数

1.题目基本信息 1.1.题目描述 给你一个 下标从 0 开始 的矩阵 grid。每次操作&#xff0c;你可以把 grid 中的 一个 1 变成 0 。 如果一个矩阵中&#xff0c;没有 1 与其它的 1 四连通&#xff08;也就是说所有 1 在上下左右四个方向上不能与其他 1 相邻&#xff09;&#x…

MySQL高可用集群

https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-innodb-cluster.html 1 什么是MySQL高可用集群 MySQL高可用集群&#xff1a;MySQL InnoDB ClusterInnoDB Cluster是MySQL官方实现高可用读写分离的架构方案&#xff0c;包含以下组件 MySQL Group Replication&#xff1a;简…

day14 leetcode-hot100-27(链表6)

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 1. 暴力法 思路 创建一个空节点&#xff0c;用来组装这两个链表&#xff0c;谁小谁就是下一个节点。 知识 创建空节点&#xff1a;ListNode n1 new ListNode(-1); 具体代码 /*** Definition for singly-l…

YOLOv5 :训练自己的数据集

- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 我们接着上一篇文章配置完YOLOv5需要的环境后&#…

flutter项目迁移空安全

重中之重 备份好项目文件&#xff0c;甚至连已经加载好的flutter库也可以备份。环境包升级 2.1 不要直接换成flutter:3.0以上的版本&#xff0c;这样做既有基本的库兼容问题&#xff0c;又有空安全下的语法问题(整个项目中需要增加 late、?、!的语法错误&#xff0c;一片报错的…

MySql(十二)

目录 MySql约束 1.添加主键约束 语法格式 1&#xff09;创建一个带主键的表 查看表结构 2&#xff09;创建表的时候指定主键名称 查看表结构 3&#xff09;创建一个表然后&#xff0c;然后再使用alter为列添加主键 查看表结构 4&#xff09;为表添加数据 1---正常数据 2---主键…

51c视觉~3D~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13954440 #SceneTracker 在4D时空中追踪万物&#xff01;国防科大提出首个长时场景流估计方法 本篇分享 TPAMI 2025 论文​​SceneTracker: Long-term Scene Flow Estimation Network​​&#xff0c;国防科大提出首…

【2025年电工杯数学建模竞赛A题】光伏电站发电功率日前预测问题+完整思路+paper+源码

本人7年数学建模竞赛经验&#xff0c;历史获奖率百分之百。团队成员都是拿过全国一等奖的硕博&#xff0c;有需要数模竞赛帮助的可以私信我 本题主要涉及数据预测&#xff0c;数据分析&#xff0c;机器学习&#xff0c;时间序列等知识 1.问题背景与问题描述 2.解题思路分析 …

OpenCv高阶(十九)——dlib关键点定位

文章目录 一、什么是人脸关键点定位&#xff1f;二、关键点模型的下载及关键信息的理解三、dlib关键点定位的简单实现&#xff08;1&#xff09;导入必要的库&#xff08;2&#xff09;从指定路径读取图像文件&#xff08;3&#xff09;创建dlib的正面人脸检测器对象&#xff0…

BUUCTF之[ACTF2020 新生赛]BackupFile

打开环境就一句话 找出源文件! 结合题目名字&#xff1a;BackupFile 先用dirsearct扫描网站文件 发现一个index.php.bak ,拼接url下载 打开发现php代码 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…

头歌之动手学人工智能-Pytorch 之autograd

目录 第1关&#xff1a;Variable 任务描述 编程要求 测试说明 没有伟大的愿望&#xff0c;就没有伟大的天才。——巴尔扎克开始你的任务吧&#xff0c;祝你成功&#xff01; 第2关&#xff1a;Variable 属性 任务描述 编程要求 测试说明 真正的科学家应当是个幻想家&a…

Kafka集成Flume/Spark/Flink(大数据)/SpringBoot

Kafka集成Flume Flume生产者 ③、安装Flume&#xff0c;上传apache-flume的压缩包.tar.gz到Linux系统的software&#xff0c;并解压到/opt/module目录下&#xff0c;并修改其名称为flume Flume消费者 Kafka集成Spark 生产者 object SparkKafkaProducer{def main(args:Array[S…

Scratch节日 | 拯救屈原 | 端午节

端午节快乐&#xff01; 这款特别为端午节打造的Scratch游戏 《拯救屈原》&#xff0c;将带你走进古代中国&#xff0c;感受历史与文化的魅力&#xff01; &#x1f3ee; 游戏介绍 扮演勇敢的探险者&#xff0c;穿越时空回到古代&#xff0c;解锁谜题&#xff0c;完成任务&…

rabbitmq Direct交换机简介

在实际开发中&#xff0c;需求可能变得复杂&#xff0c;如消息的收发和处理。以支付系统为例&#xff0c;成功支付后需要改变订单状态并通知用户&#xff0c;而失败则不需要。为处理这种情况&#xff0c;提出了使用Direct交换机&#xff0c;它可以根据规则将消息路由到指定队列…

Git实战--基于已有分支克隆进行项目开发的完整流程

Git克隆项目开发流程 ✅ 一、完整流程概述✅ 二、详细操作步骤Step 1&#xff1a;克隆仓库&#xff08;如果尚未克隆&#xff09;Step 2&#xff1a;获取远程分支信息并切换到 feature/ 获取所有远程分支Step 3&#xff1a;创建并切换到你的新分支Step 4&#xff1a;开始开发新…

2_MCU开发环境搭建-配置MDK兼容Keil4和C51

MCU开发环境搭建-配置MDK兼容Keil4和C51 一、概述 本文以MDK-ARM V5.36版本基础介绍DMK-ARM工程兼容Keil4和C51的配置。 注:在阅读本文前,请先安装和配置完成MDK-ARM(Keil5)。 二、工具包下载 链接: https://pan.baidu.com/s/1Tu2tDD6zRra4xb_PuA1Wsw 提取码: 81pp 三、…