对于这道题我们要弄懂他排队规则和列对规则,首先考虑什么时候列新队列,就是当所有队列末尾都比这个进入车队的序号小,我们开启新的对列,如果当前队列末尾有比这时进入车队的序号大呢,我们该怎么选,我们应该选相差值最小的。举例说一下,2 4 8 这一对和 3 7 这一对,当序号为1的车要入队时,我们应该选差值最小的2号车后面,所以 1 2 4 8是1的归宿。程序构建法,我们依旧用vector代替队列,然后我们用一个二维vector来储存每一个对的元素,再用一个vector来作临时对,目的是要堆到二维vector中,最后我们输出二维vector的行数即可。
具体代码如下
#include<bits/stdc++.h>
using namespace std;
int main()
{
vector<vector<int> >que;
vector<int>d;
int a;cin>>a;
while(a--)
{
int k;cin>>k;
int flag=0;
int bijiao=100001;
int index=-1;
for(int i=0;i<que.size();i++)
{
if(que[i].back()>k)
{
if(bijiao>que[i].back())
{
index=i;bijiao=que[i].back()-k;flag=1;
}
}
}
if(flag==1)
{
que[index].push_back(k);
}
else
{
d.push_back(k);
que.push_back(d);
d.clear();
}
}
cout<<que.size();
}
这种写法会导致超时,所以我们在优化一下代码,但我们对于每一队我们只留末尾,删除条件就是如果可以加入该车队就把末尾删掉,再进去。最后看有几个队尾存在就是用了几队。我们运用了set法,比较省事,并且不会超时。具体代码如下
#include<bits/stdc++.h>
using namespace std;
int main()
{
set<int>a;
int x;cin>>x;
while(x--)
{
int k;cin>>k;
if(a.upper_bound(k)!=a.end())a.erase(a.upper_bound(k));
a.insert(k);
}
cout<<a.size();
}