题目描述
LXK有一个序列,从
N
N
N~
1
1
1,但是他不小心把序列打乱了,现在他想找你把这串序列复原。
他讨厌用传统的方式排序。所以他用他自己的方式进行复原。
他有
K
K
K个先进先出的队列
对于某个数字,你可以选择将其放入任意队列之中(不能不放)。
每个队列中队首的数字可以在任意时间出队列。
利用这些队列,聪明的LXK就可以将序列复原回降序。
他想知道这些操作最少需要准备多少个队列?
输入描述
一个数
N
(
N
<
100000
)
N(N<100000)
N(N<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大佬的,假装是自己写出来的。同时,题目只给了两个样例,因为是逆序输出,可以测试刚好是逆序的情况。