L2-014 列车调度(二分)
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
以上是关于L2-014 列车调度(二分)的主要内容,如果未能解决你的问题,请参考以下文章