火车站的列车调度铁轨的结构如下图所示。
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?
输入格式:
输入第一行给出一个整数N (2 ≤ N ≤10 5),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。
输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
输入样例:
9
8 4 2 5 3 9 1 6 7
输出样例:
4
错误代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int f[100005] ;
int main()
{
int n , tip = 0 , min1 , ans = 1;
cin>>n;
for(int i = 1 ; i <= n ; i++)
cin>>f[i];
min1 = f[1];
f[1] = 0;
tip++;
while(1)
{
for(int i = 2 ; i <= n ; i++)
{
if(f[i] < min1 && f[i] != 0)
{
min1 = f[i];
f[i] = 0;
tip++;
}
}
//cout<<tip<<endl;
if(tip == n)
break;
else
ans++;
for(int i = 2 ; i <= n ; i++)
if(f[i] != 0)
{
min1 = f[i];
f[i] = 0;
tip++;
break;
}
}
cout<<ans;
}
这个有两个测试点超时,去网上看了看大神们写的才知道用set来处理这道题
思路:
用upper_bound()找到比当前车厢号大的最小车厢号,删除大的最小车厢号,插入当前车厢号,如果找不到直接插入
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include <set>
using namespace std;
int main()
{
set<int> s;
int n,num;
cin >> n;
for(int i = 0;i < n;i++)
{
cin >> num;
if(s.upper_bound(num)!=s.end())
{
s.erase(s.upper_bound(num));
}
s.insert(num);
}
cout<<s.size();
}
set常用函数
#include <iostream>
#include <set>
using namespace std;
int main()//此代码来源于博主打比赛的无敌风骚的大神队友
{
set<int> s;
set<int>::iterator it = s.begin();
//1、插入(输入)元素
for(int i = 0; i < 10; i++)
s.insert(i);
//2、删除元素(删除第0个后面的元素)
s.erase(0);
//3、输出 (迭代器输出)
for(it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
cout << endl;
//4、大小
cout << s.size() << endl;
//5、是否为空
cout << s.empty();
//6、清空
s.clear();
return 0;
}