题解:B4171 [BCSP-X 2024 6 月小学高年级组] 选择排序
HuangRuibo · · 题解
题解
B4171
题目传送门
BCSP-X落榜生的题解
做题思路
我爱 vector
注意:本代码 vector 较多,请自行选择观看。
输入部分
int n, m;
cin >> n >> m;
vector<int> arr(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
vector<int> queries(m);
for (int i = 0; i < m; ++i) {
cin >> queries[i];
}
初始化位置数组
vector<int> pos(n + 1);
for (int i = 0; i < n; ++i) {
pos[arr[i]] = i + 1; // 1-based
}
开干,排序!
知识点: for( : ) 传送门
(注:不是自己的Blog,仅供题解参考,无抄袭/侵权想法)
for (int q : queries) {
while (processed < q) {
processed++;
int i = processed;
int current_i = i;
int current_pos = pos[current_i];
if (current_pos >= i) {
// 交换 current_arr[i-1] 和 current_arr[current_pos-1]
int x = current_arr[i - 1];
int y = current_arr[current_pos - 1];
swap(current_arr[i - 1], current_arr[current_pos - 1]);
// 更新 pos 数组
pos[x] = current_pos; // x被交换到了原current_pos的位置
pos[y] = i; // y被交换到了i的位置
}
}
输出!Output!
for (int i = 0; i < n; ++i) {//此处书接上回
cout << current_arr[i] << " ";
}
cout << endl;
}
好·习惯
return 0;
AC Code:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> arr(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
vector<int> queries(m);
for (int i = 0; i < m; ++i) {
cin >> queries[i];
}
// 初始化位置数组
vector<int> pos(n + 1);
for (int i = 0; i < n; ++i) {
pos[arr[i]] = i + 1; // 1-based
}
vector<int> current_arr = arr;
int processed = 0;
for (int q : queries) {
while (processed < q) {
processed++;
int i = processed;
int current_i = i;
int current_pos = pos[current_i];
if (current_pos >= i) {
// 交换 current_arr[i-1] 和 current_arr[current_pos-1]
int x = current_arr[i - 1];
int y = current_arr[current_pos - 1];
swap(current_arr[i - 1], current_arr[current_pos - 1]);
// 更新 pos 数组
pos[x] = current_pos; // x被交换到了原current_pos的位置
pos[y] = i; // y被交换到了i的位置
}
}
// 输出当前的数组
for (int i = 0; i < n; ++i) {
cout << current_arr[i] << " ";
}
cout << endl;
}
return 0;
}