排序刷题12 -双向排序

题目来源:[蓝桥杯 2021 省 B] 双向排序 - 洛谷

最近开始刷蓝桥杯的题目了,本小白表示有些题目好难阿,研究生组哭晕(((φ(◎ロ◎;)φ)))。这道题自己做只能达到60分,本小白表示100分优化不会惹,先拿点分后面再看别人的思路吧。

解题思路:想到了用sort()函数解决,发现也就60分,超时了。不过没关系能拿一点是一点。(hahahaha~,心态有点好)

解题步骤:

  1. 初始化一个大小为 n+1 的数组(考虑到序列是从1开始的),用于记录每个位置的元素值。
  2. 遍历操作指令,根据操作类型更新序列:
    • 当 p_i = 0 时,表示需要将前 q_i 个元素降序排列。这里可以标记一个断点 q_i,表示 1到 q_i 需要降序排列。
    • 当 p_i = 1 时,表示需要将从 q_i 到 n$的元素升序排列。同样,标记一个断点 q_i,表示 q_i到 n 需要升序排列。
  3. 最后,根据这些断点信息,构造最终的序列。
#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值