山东财经大学新生赛暨天梯赛选拔赛 F.简单排序(思维)

题目链接

题目描述

LXK有一个序列,从 N N N~ 1 1 1,但是他不小心把序列打乱了,现在他想找你把这串序列复原。
他讨厌用传统的方式排序。所以他用他自己的方式进行复原。
他有 K K K个先进先出的队列
对于某个数字,你可以选择将其放入任意队列之中(不能不放)。
每个队列中队首的数字可以在任意时间出队列。
利用这些队列,聪明的LXK就可以将序列复原回降序。
他想知道这些操作最少需要准备多少个队列?

输入描述

一个数 N ( N &lt; 100000 ) N(N&lt;100000) NN<100000
表示数字的数目
接下来一行 n n n个数字

输出描述

一个数 k k k
表示最少需要多少个队列才能满足要求

示例1

输入
5
1 2 3 4 5
输出
5

示例2

输入
7
1 2 5 7 3 4 6
输出
5
题目大意

题目意思就是题面所描述的,求所需要的队列数。

解题思路

因为到底需要多少的队列我是不知道,所以我选择一个动态的数组来。但因为这道题要用到二分查到,所以要用到有序数列,所以就干脆用了一个 s e t set set(其实也不是必须要用 s e t set set,自己用 s o r t sort sort排序也行),每个下标对应的值表示该队列所能表示的最小值(因为题目要求倒序输出,所以更大的数必须排在前面,某个数 a a a能到放到队列 b b b中取决于 a a a比队列 b b b中的最小值还要小),如果有则更新,否则插入。

AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n;
    set<int> s;
    while(n--)
    {
        cin>>m;
        if(s.upper_bound(m)!=s.end())
        {
            s.erase(s.upper_bound(m));
        }
        s.insert(m);
    }
    cout<<s.size()<<endl;
    return 0;
}
总结

自己最开始的思路也是这样,但是没有有效的借助 S T L STL STL和理清条件关系,所以代码写的有点长,这个代码借鉴 p z r pzr pzr大佬的,假装是自己写出来的。同时,题目只给了两个样例,因为是逆序输出,可以测试刚好是逆序的情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值