7-9 列車排程
阿新 • • 發佈:2021-01-20
7-9 列車排程 (25分)
火車站的列車排程鐵軌的結構如下圖所示。
兩端分別是一條入口(Entrance)軌道和一條出口(Exit)軌道,它們之間有N條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最後從出口離開。在圖中有9趟列車,在入口處按照{8,4,2,5,3,9,1,6,7}的順序排隊等待進入。如果要求它們必須按序號遞減的順序從出口離開,則至少需要多少條平行鐵軌用於排程?
輸入格式:
輸入第一行給出一個整數N (2 ≤ N ≤10e5 ),下一行給出從1到N的整數序號的一個重排列。數字間以空格分隔。
輸出格式:
在一行中輸出可以將輸入的列車按序號遞減的順序調離所需要的最少的鐵軌條數。
輸入樣例:
9
8 4 2 5 3 9 1 6 7
輸出樣例:
4
AC
兩個不錯的文章
解題思路:
先將一個數插入進set容器中,set容器預設從小到大,在依次進行每個數的錄入,如果錄入的數比當前set容器中的最後一個數小,刪除set容器中第一個大於錄入數的值(或指標),在將錄入數進行插入,依次迴圈往復,進行到結尾
注意點:
1.s.erase();可以刪除值,指標,區間[左閉右開]
2.對於upper_bound來說,返回的是被查序列中第一個大於查詢值的[指標]3.lower_bound則是返回的是被查序列中第一個大於等於查詢值的[指標]
4.set容器的最後一個指標不是s.end();而是s.end()-1或者s.rbegin();
s.end()通常被當做結束的標誌,if(!s.end())如果沒結束等等
#include<iostream>
#include<set>
using namespace std;
int main() {
int n,t;
cin>>n>>t;
set<int> s;
s.insert(t);
for(int i=1; i<n; i++ ) {
cin>>t;
if(t<*s.rbegin())
s.erase(*(s.upper_bound(t)));
s.insert(t);
}
cout<<s.size();
return 0;
}
錯誤!!!
#include<bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n;
cin>>n;
int a[n];
for(int i=0; i<n; i++)
cin>>a[i];
int b[n]= {0}; //標記陣列
int cnt=0;
for(int i=0; i<n; i++) {
if(b[i]==0) {
cnt++;
b[i]=1;
} else continue;
for(int j=i+1; j<n; j++) {
if(a[j]>a[i]&&b[j]==0) {
b[j]=1;
}
}
}
cout<<cnt;
return 0;
}