L2-014 列车调度(二分)

题目链接

https://pintia.cn/problem-sets/994805046380707840/problems/994805063166312448

思路

其实这道题目很容易让人摸不着头脑求什么,意思就是我们要求最少的轨道数,而这个轨道上面可以摆放无线量车,但是车进轨道是有先后顺序的,我们最后只需要从我们分配的轨道中将这些车按照降序能从出口出去就是成立的轨道。

比如说这里我们分成四个轨道:

轨道1: 1 2 4 8
轨道2: 3 5
轨道3: 6 9
轨道4: 7

这样我们在车辆出去的时候就能通过先后顺序到达降序输出的效果,实际上也就是我们要划分递减子序列,我们可以通过贪心的去想,如果当前的这一辆车的编号比所有轨道中编号最小的车都大,那么这个车应该单独开一个轨道,否则的话我们就将当前的这个车放在最接近的一个编号的后面,那么这里需要注意,如果说我们在第一个轨道已经有了 8 8 8 ,当我们当前的这一辆车是 4 4 4 的时候这里的 8 8 8 其实就没有作用了,我们可以直接用 4 4 4 将其代替。最后只需要输出在这个集合中的元素个数即可,我们可以通过 set 来存储,也可以通过数组或者其他方式存储,每次寻找最接近的编号可以通过二分查找加快寻找速度

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f

const int N = 1e5+10;

int n,a[N];

int main()
{
    
    
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	set<int> S;
	for(int i = 1;i <= n; ++i) {
    
    
		cin>>a[i];
		auto it = S.lower_bound(a[i]);
		if(it == S.end()) S.insert(a[i]);
		else {
    
    
			S.erase(it);
			S.insert(a[i]);
		}
	}
	cout<<S.size()<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_46201544/article/details/123938409