P1116 车厢重组 - 洛谷 冒泡排序

59 阅读1分钟

P1116 车厢重组 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目要求只能相邻的两两交换,实际上就是冒泡排序。

左边是最少方案数,右边是最多方案数:

右边比左边多的原因在于圈红圈的地方,3 4已经排好了,就应该跳过不再去排3 4,而是应该回到数组开头排数组其他元素。

image.png

如果我们只是把数字遍历一遍,交换一遍并不能得出正确结果:

for (int i = 0; i < v.size() - 1; i++)
{
        if (v[i] > v[i + 1])
        {
                swap(v[i], v[i + 1]);
                cnt++;
        }

}	

image.png

所以我们要多次遍历整个数组:

while (1)
	{
		bool flag = true;
		for (int i = 0; i < v.size() - 1; i++)
		{
			if (v[i] > v[i + 1])
			{
				swap(v[i], v[i + 1]);
				cnt++;
				flag = false;
			}

		}	
		if (flag == true)break;
	}

image.png

code

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

void reverse(vector<int>& v) {
	int cnt = 0;

	while (1)
	{
		bool flag = true;
		for (int i = 0; i < v.size() - 1; i++)
		{
			if (v[i] > v[i + 1])
			{
				swap(v[i], v[i + 1]);
				cnt++;
				flag = false;
			}

		}	
		if (flag == true)break;
	}

	cout << cnt << endl;
	//for (int i = 0; i < v.size(); i++) {
	//	cout << v[i] << " ";
	//}	cout << endl;
}

int main() {
	int n;
	cin >> n;

	vector<int> v(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	reverse(v);
	return 0;
}