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 }
原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256586.html