题目来源:[蓝桥杯 2021 省 B] 双向排序 - 洛谷
最近开始刷蓝桥杯的题目了,本小白表示有些题目好难阿,研究生组哭晕(((φ(◎ロ◎;)φ)))。这道题自己做只能达到60分,本小白表示100分优化不会惹,先拿点分后面再看别人的思路吧。
解题思路:想到了用sort()函数解决,发现也就60分,超时了。不过没关系能拿一点是一点。(hahahaha~,心态有点好)
解题步骤:
- 初始化一个大小为 n+1 的数组(考虑到序列是从1开始的),用于记录每个位置的元素值。
- 遍历操作指令,根据操作类型更新序列:
- 当 p_i = 0 时,表示需要将前 q_i 个元素降序排列。这里可以标记一个断点 q_i,表示 1到 q_i 需要降序排列。
- 当 p_i = 1 时,表示需要将从 q_i 到 n$的元素升序排列。同样,标记一个断点 q_i,表示 q_i到 n 需要升序排列。
- 最后,根据这些断点信息,构造最终的序列。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
// 读入序列长度 n 和操作次数 m
int n, m;
cin >> n >> m;
// 初始化序列 arr,按照题目要求填充从 1 到 n 的整数
vector<int> arr(n);
for (int i = 0; i < n; i++)
{
arr[i] = i + 1;
}
// 对每一个操作进行处理
for (int i = 0; i < m; i++)
{
int p, q;
cin >> p >> q; // 读入操作类型 p 和操作参数 q
// 根据操作类型对序列的相应部分进行排序
if (p == 0)
// p 为 0 时,对前 q 个元素执行降序排序
sort(arr.begin(), arr.begin() + q, greater<int>());
else
// p 为 1 时,对从第 q 个元素到末尾的部分执行升序排序
sort(arr.begin() + q - 1, arr.end());
}
// 输出最终的序列
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}