列表

详情


NC23654. 简单排序

描述

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

输入描述

一个数N(N<100000)

表示数字的数目

接下来一行 n个数字

输出描述

一个数k

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

示例1

输入:

5
1 2 3 4 5

输出:

5

示例2

输入:

7
1 2 5 7 3 4 6

输出:

5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 28ms, 内存消耗: 476K, 提交时间: 2019-03-16 15:48:52

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000001]={0};
int main()
{
	int n,y,c=0,d,*x;
	scanf("%d",&n);
	for(y=0;y<n;y++)
	{
		scanf("%d",&d);
		x=lower_bound(a,a+c,d);
		*x=d;
		if(x==a+c)
			c++;
	}
	printf("%d",c);
	return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 54ms, 内存消耗: 436K, 提交时间: 2023-03-14 11:00:08

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n;
    set<int>s;
    cin>>n;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        auto k=s.lower_bound(x);
        if(k!=s.end())s.erase(k);
        s.insert(x);
    }
    cout<<s.size()<<endl;
}

C++11(clang++ 3.9) 解法, 执行用时: 34ms, 内存消耗: 504K, 提交时间: 2020-09-26 23:22:19

#include<bits/stdc++.h>
using namespace std;
set<int>s;
int main()
{
	int n,t;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&t);
		if(s.upper_bound(t)!=s.end())
		s.erase(s.upper_bound(t));
		s.insert(t);
	}
	printf("%d",s.size());
}

上一题