京东C++开发工程师2020春(编程2)

题目描述

有n位乘客乘坐一列列车,列车一共会依次经过105个站点,从1到105编号。
我们已知每一位乘客的上车站点和下车站点,但是不知道这些乘客的订票顺序。
当一位乘客订票时,他会在当前还空余的座位中选择一个他喜欢的位置,但是我们不知道乘客的喜好,所以他具体订哪个位置我们是不知道的。
现在你需要计算列车最少需要安排多少个座位,可以使得无论乘客的订票情况和顺序是怎么样的,所有乘客都有座位可以坐。
举个例子,有三位乘客:
A:1→2
B:2→3
C:1→3
若订票顺序是A,C,B,那么只需要两个座位就一定能满足。当A订票时,他会选择一个座位,当C订票时,可用座位只剩下一个,他会订这个剩余的座位,当B订票时,可用座位也只有一个,他会订这个座位(即最开始A的那个座位);
若订票顺序是A,B,C,那么有可能会需要三个座位。A订了一个座位,B订了与A不同的座位,此时C来订票时他只能订第三个座位。
所以对于这组例子,答案是3。

输入

第一行包含一个整数 n,表示乘客的数量。(1 <= n <= 1000)
接下来 n 行每行包含两个整数si,ti,表示第 i 位乘客的上车站点和下车站点。(1 <= si < ti <= 105

输出

输出对应的答案。

样例输入

10
84 302
275 327
364 538
26 364
29 386
545 955
715 965
404 415
903 942
150 402

样例输出

6

思路

遍历每一张票,记录区间相交的个数,最后输出最大相交区间

代码
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main() {
    
    

	int N = 0;
	cin >> N;
	int Max = 0;
	vector<vector<int> > ticket(N, vector<int>(2));
	
	for (int i = 0; i < N; i++) {
    
    
		cin >> ticket[i][0] >> ticket[i][1];
	}
	
	for (int i = 0; i < N; i++) {
    
    
		int tmp = 0;
		for (int j = 0; j < N; j++) {
    
    
			if (ticket[j][0] <= ticket[i][0] && ticket[j][1] > ticket[i][0] ||  
			ticket[j][0] < ticket[i][1] && ticket[j][1] >= ticket[i][1] ||  
			ticket[j][0] >= ticket[i][0] && ticket[j][1] <= ticket[i][1] ||  
			ticket[j][0] <= ticket[i][0] && ticket[j][1] >= ticket[i][1]) {
    
    
				tmp++;
			}
			Max = max(Max, tmp);
		}
	}
	cout << Max;
	
	return 0;
}

个人能力有限,可能有错漏,还请评论告知,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_27677599/article/details/105729520
今日推荐