先分析题干,给出n辆车的信息,要我们求出最少要移除多少辆车后能保证不相撞.
思路:判断车辆是否和他们的位置和速度相关,先按照他们的位置来排序,排序号后按照他们的位置来比较他们的速度.
如果位置靠后的车辆速小则要移除。
这道题的难点在于怎么样求要移除的数量最小,可以沿用最长不下降字串的思路,对于每一个车,如果他的速度不小于它前面的一辆车,那么就将它加入到字串中,如果小于,就找到第一个大于等于他的速度,将两者替换。
替换后分2种情况:
1:替换后新的字串的长度大于原先的字串:子串长度增大,最大字串长度为当前字串的长度。
2:替换后新的字串的长度小于原先的字串:由于替换的是第一个不小于当前车辆的速度,字串长度没变,最长的字串的长度为该字串的长度。
要移除的车辆的数量 = 总车辆 - 最大不下降字串的长度.
#include<bits/stdc++.h>
struct car {
int v;
int x;
};
bool comp(const car& a,const car& b){
return a.x<b.x;
}
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<car> t(n);
priority_queue<car> s;
for (int i = 0; i < n; i++) {
cin >> t[i].x >> t[i].v;
}
sort(t.begin(),t.end(),comp);
vector<int> ans;
for(auto it=t.begin();it!=t.end();it++){
if(ans.empty() || ans.back()<= (*it).v){
ans.push_back((*it).v);
}else{
*upper_bound(ans.begin(),ans.end(),(*it).v)=(*it).v;
}
}
cout<<n-ans.size();
}

京公网安备 11010502036488号