CSU 1757 火车进站 1757
1757: 火车入站
Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 463 Solved: 117
Description
火车站人们总是在站台等待列车进站,一个站台有火车停留的时候就不能有其他火车进入,今天有n辆火车经过,已知它们进站时间Si以及出站时间Ti,进站时间到出站时间之间火车必须有一个站台给它停靠,问让所有火车都能按时停靠,至少要安排多少个站台给这些火车
Input
第一行输入一个正整数T,表示数据组数
每组数据第一行输入一个正整数n,表示火车数量(n<=10000)
接下来n行,每行输入2个正整数Si,Ti,表示第i辆火车的进站时间和出站时间(Si<Ti<1e9)
Output
每组数据输出至少需要安排多少个站台
Sample Input
1 3 1 3 3 4 4 6
Sample Output
2
区间覆盖问题。
用结构体存下时间和状态(进还是出),比如 1 3,4 5.排完序后就是 1l 3r 4l 5r ,遇l则表示进入一个区间,遇r则退出这个区间,记录最大的区间数即可。
当数据 1 3,2 4时,排完序1l,2l,3r,4r。2l是在3r出之间就必须再加一个区间,其实就是一个数轴上,独立的一个区间,再来一个区间后,检查新区间的左端点是否在老区间里面,自然是和
老区间的右端点比较,这道题就是多个区间,独立没有相交的区间忽略(火车可以直接开进来),求相交的区间个数。全部合成一张表,排序后扫描记录最大值即可。
注意刚开始Max直接在sum++哪里赋值,是不对的。因为可能--了很多次才++就不对了。
1 #include <iostream> 2 #include <cstring> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <algorithm> 6 using namespace std; 7 const int maxn = 10005*2; 8 9 struct Node { 10 int x; 11 char s; 12 }node[maxn]; 13 14 int cmp(Node a,Node b) { 15 if(a.x != b.x) 16 return a.x < b.x; 17 else 18 return a.s < b.s; 19 } 20 21 int main() 22 { 23 // freopen("in.txt","r",stdin); 24 int T; 25 cin>>T; 26 while(T--) { 27 int n; 28 cin>>n; 29 for(int i = 0; i < n*2; i++) { 30 cin>>node[i].x; 31 if((i+1)%2==1) 32 node[i].s = 'l'; 33 else { 34 node[i].s = 'r'; 35 } 36 } 37 sort(node,node+n*2,cmp); 38 int sum = 0; 39 int Max = -1; 40 for(int i = 0; i < n*2; i++) { 41 if(node[i].s == 'l') { 42 sum++; 43 Max = max(sum,Max); 44 } 45 else 46 sum--; 47 } 48 cout<<Max<<endl; 49 } 50 51 return 0; 52 }