题意:
有很多火车会从东西两个方向进入轨道,进入时间小于0,出去时间大于0,问最少要多少轨道使得轨道之间不互相堵塞.堵塞是指一辆火车要往西另一辆要往东,两个互相堵塞都出不去,或者两个都向一个方向,但是在门口的出去时间比他的后面的出去时间晚.
题解:
首先考虑一个方向的,比如都是从东进从东出,按进入时间排序是显然的,比方说按时间从小到大排,那么一辆火车想进入一个轨道的话它的出去时间必然要比已有轨道的出去时间小,否则堵塞了,然后他必定接在跟他时间最接近的轨道上,若没有比他时间大的则另开一个轨道把它放上去.
然后考虑有东西方向的,则可以通过一个无穷大量,将时间都映射到一个方向上.
/* * File: main.cpp * Author: swordholy * * Created on 2011年2月27日, 下午1:24 */ #include <cstdlib> #include <iostream> #include <stdio.h> #include <string> #include <list> #include <algorithm> #include <memory.h> using namespace std; struct in_out { int t,dir; }; struct TR { in_out in; in_out out; bool operator < (TR const &rhs) const { if (in.t<rhs.in.t) return true; else return false; } }; #define MAXN 70005 #define INF 20000000 TR train[MAXN]; /* * */ int truck[10005]; string s; int ans,ln,n; bool used[MAXN]; void calc_s(int i) { int f,n,ii,flag,rec_n; in_out rec[3]; f=1;n=0;rec_n=0; for(ii=0;ii<s.length();ii++) { if (s[ii]=='E') { flag=1; ++rec_n; rec[rec_n].dir=flag; rec[rec_n].t=f*n; n=0;f=1; } else if (s[ii]=='W') { flag=-1; ++rec_n; rec[rec_n].dir=flag; rec[rec_n].t=f*n; n=0;f=1; } else if (s[ii]=='-') f=-1; else n=n*10+s[ii]-'0'; } train[i].in=rec[1]; train[i].out=rec[2]; } int main(int argc, char** argv) { int t,m,i,j,u; cin>>t; for(u=1;u<=t;u++) { cin>>n; for(i=1;i<=n;i++) { cin>>s; calc_s(i); if (train[i].in.dir==-1) train[i].in.t=-INF-train[i].in.t; if (train[i].out.dir==-1) train[i].out.t=INF-train[i].out.t; } sort(train+1,train+1+n); ans=0;ln=0; memset(used,0,sizeof(used)); memset(truck,0,sizeof(truck)); for(i=1;i<=n;i++) { int k=lower_bound(truck,truck+1+ans,train[i].out.t)-truck; truck[k]=train[i].out.t; if (k>ans) ans=k; } cout<<ans<<endl; } return 0; }