P1116 车厢重组 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目要求只能相邻的两两交换,实际上就是冒泡排序。
左边是最少方案数,右边是最多方案数:
右边比左边多的原因在于圈红圈的地方,3 4已经排好了,就应该跳过不再去排3 4,而是应该回到数组开头排数组其他元素。
如果我们只是把数字遍历一遍,交换一遍并不能得出正确结果:
for (int i = 0; i < v.size() - 1; i++)
{
if (v[i] > v[i + 1])
{
swap(v[i], v[i + 1]);
cnt++;
}
}
所以我们要多次遍历整个数组:
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;
}
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;
}