有一个隧道,某一天一共有 n 辆车通过且都只通过一次。交通规章规定这个隧道里不能超车,因此在隧道的入口和出口都有监控,能记录下这些车出入隧道的顺序。 但总有一些法外之徒,喜欢飞车,这是很不好的行为。 规定如下: 如果车b 本来是排在车a的后面进入隧道 但隧道中进行了超车行为,于是车b先于车a出隧道了。 现在请求出一共多少辆车发生了超车行为,注意超过一辆车与超过多辆车,都只按一次计算。 即只需要有多少车发生了超车行为c++代码。
时间: 2024-03-17 15:47:54 浏览: 72
以下是 C++ 实现的代码,使用归并排序的思想:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int merge(vector<int>& arr, int l, int mid, int r) {
vector<int> temp;
int i = l, j = mid + 1, cnt = 0;
while (i <= mid && j <= r) {
if (arr[i] <= arr[j]) {
temp.push_back(arr[i++]);
} else {
temp.push_back(arr[j++]);
cnt += mid - i + 1;
}
}
while (i <= mid) {
temp.push_back(arr[i++]);
}
while (j <= r) {
temp.push_back(arr[j++]);
}
for (int k = l; k <= r; k++) {
arr[k] = temp[k - l];
}
return cnt;
}
int mergeSort(vector<int>& arr, int l, int r) {
if (l >= r) {
return 0;
}
int mid = l + (r - l) / 2;
int cnt = mergeSort(arr, l, mid) + mergeSort(arr, mid + 1, r) + merge(arr, l, mid, r);
return cnt;
}
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int cnt = mergeSort(arr, 0, n - 1);
cout << cnt << endl;
return 0;
}
```
输入格式为:第一行为车辆数量 n,第二行为 n 个整数,表示车辆通过隧道的顺序。输出为超车行为的次数。
阅读全文