L2-014. 列车调度
时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
火车站的列车调度铁轨的结构如下图所示。
Figure
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?
输入格式:
输入第一行给出一个整数N (2 <= N <= 105),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。
输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。
输入样例:9 8 4 2 5 3 9 1 6 7输出样例:
4
这个题看了网上大神的思路,其实思路感觉殊途同归吧,但是当时比赛的时候超时......,就是尽可能的利用这个串让这个串递减的最长,
对于这个题来说使用的策略就是枚举现存的最大值,枚举完之后在从它的右边枚举最大值,这样枚举完之后就是一串.....
但是常规的超时,多以转化为线段树利用区间去最值加快速度
#include <bits/stdc++.h> using namespace std; #define maxn 100010 #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 int sum[maxn<<2]; int a[maxn]; int pos[maxn]; int n; int cnt; void pushup(int rt) { sum[rt] = max(sum[rt<<1], sum[rt<<1|1]); } void build(int l, int r, int rt) { if(l == r) { sum[rt] = a[++cnt];return; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt); } int qurey(int L, int R, int l, int r, int rt) { if(L <= l && r <= R) return sum[rt]; int ret = -1; int m = (l + r) >> 1; if(L <= m) ret = max(ret, qurey(L, R, lson)); if(R > m) ret = max(ret, qurey(L, R, rson)); return ret; } void updata(int p, int add, int l, int r, int rt) { if(l == r) { sum[rt] = add;return; } int m = (l + r) >> 1; if(p <= m) updata(p, add, lson); if(p > m) updata(p, add, rson); pushup(rt); } int main() { int n; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); pos[a[i]] = i; } cnt = 0; build(1, n, 1); int tol = 0,deep = 0; while(tol < n ) { int l = 1; while(l <= n) { int cur = qurey(l, n, 1, n, 1); if(cur < 0) break; l = pos[cur]; updata(l, -maxn, 1, n, 1); tol++; l++; } deep++; } printf("%d\n",deep); }
//set 也可以水过,set利用的思想就是维护每个串尾的最小值,如果本次的值在串里面有比它大的那么说明它可以跟在这个串的后面,更新串的最小值
最后看有几个值就代表有几个串,因为每个值都代表了每个串的最小值
#include <bits/stdc++.h> using namespace std; int main() { set<int>q; set<int>::iterator it; int n; scanf("%d", &n); for(int i = 1; i <= n; i++) { int x; scanf("%d", &x); it = q.lower_bound(x); if(it!= q.end()) { q.erase(it); q.insert(x); } else q.insert(x); } cout<<q.size()<<endl; return 0; }