題目:列車調度
思路:
如何能使軌道數最少?就是每次進入一個數字,看存在的軌道的是有沒有比當前值大的,大的話把當前值替換當前軌道即可,如果沒有就需新增軌道!
樣例:8 4 2 5 3 9 1 6 7
1 2 4 8
3 5
6 9
7
需用4個軌道即可按遞減輸出了!
所以按以上思路:輸入一個值,看當前所有軌道是否有大於前前值的,有的話替換當前軌道值,否則新增軌道
這裏需要用set集合實現,否則超時了。。。因爲set集合中有一個函數:lower_bound() 可以查出當前集合中有沒有比要查的值大的值,有的話直接返回此值,這樣我們就可以將此值刪除,然後將當前值加入集合,最後的集合長度即爲軌道數了!
參考:心向陽光2014博客
代碼:
#include <iostream>
#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;
set<int>s;
int main()
{
int n,fig;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&fig);
if(s.empty()) s.insert(fig);
else{
if(s.lower_bound(fig) != s.end()){//找到比當前輸入值大的值
s.erase(s.lower_bound(fig));//將較大的那個值刪除
s.insert(fig);//將當前值插入
}else s.insert(fig);//新增軌道
}
}
printf("%d\n",s.size());
return 0;
}