第一行输入为N(N ≤ 200000),表示购买课程数。接下来N行,每行输入两个数Si Ei(0 < Si < Ei < 1e9),为第i节课的起止时间。
请输出最小满足条件的K。
4 1 4 1 2 2 3 3 4
2
n = int(input()) a = [[] for i in range(n)] max_cnt = 0 for i in range(n): a[i] = list(map(int, input().split())) min1 = a[0][0] max1 = a[0][1] for i in range(n): min1 = min(min1, a[i][0]) max1 = max(max1, a[i][1]) for i in range(min1, max1+1): cnt = 0 for j in range(n): if i >= a[j][0] and i+1 <= a[j][1]: cnt += 1 max_cnt = max(max_cnt, cnt) print(max_cnt)
if __name__ == "__main__":
N = int(input())
timeline = dict()
concurrents = 0
max_concurrent = 0
for i in range(N):
S, E = list(map(int, input().split(" ")))
if S in timeline:
timeline[S] += 1
else:
timeline[S] = 1
if E in timeline:
timeline[E] -= 1
else:
timeline[E] = -1
for t in sorted(timeline):
concurrents += timeline[t]
if concurrents > max_concurrent:
max_concurrent = concurrents
print(max_concurrent) 既直白又快速。
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static int[] record;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int time = Integer.parseInt(in.nextLine());
int[] arrive=new int[time];
int[] leave = new int[time];
for(int i=0;i<time;i++){
arrive[i]=in.nextInt();
leave[i]=in.nextInt();
}
Arrays.sort(arrive);
Arrays.sort(leave);
int p_ar=0,le=0; int max_len=0;
while(p_ar<arrive.length&& le<leave.length){
if(arrive[p_ar]<leave[le]){
max_len=Math.max(max_len, p_ar-le+1);
p_ar++;
}
else{
le++;
}
}
System.out.println(max_len);
}
} 利用map记录变化量 暴力不可过
#include<bits/stdc++.h>
using namespace std;
int main(){
//freopen("in.dat", "r", stdin);
int n; cin >> n;
map<int,int> idx;
for(int i = 0; i < n; i++){
int s,e; cin >> s >> e;
idx[s]++;
idx[e]--;
}
vector<int> t;
for(auto x:idx){
t.push_back(x.second);
}
int cur = 0;
int ans = 0;
for(int i = 0; i < idx.size(); i++){
cur += t[i];
ans = max(ans,cur);
}
cout << ans << endl;
return 0;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
TreeMap<Integer, Integer> map = new TreeMap<>();
for(int i = 0; i < n; i++){
String[] params = br.readLine().split(" ");
int start = Integer.parseInt(params[0]);
int end = Integer.parseInt(params[1]);
map.put(start, map.getOrDefault(start, 0) + 1);
map.put(end, map.getOrDefault(end, 0) - 1);
}
int overLapCount = 0;
int maxOverLapCount = 0;
for(int time: map.keySet()){
overLapCount += map.get(time);
maxOverLapCount = Math.max(maxOverLapCount, overLapCount);
}
System.out.println(maxOverLapCount);
}
} 使用优先队列
#include <bits/stdc++.h>
using namespace std;
int main() {
int m, a, b;
cin >> m;
vector<vector<int>> v(m);
for (int i = 0; i < m; ++i) {
cin >> a >> b;
v[i] = {a, b};
}
sort(v.begin(), v.end());
priority_queue<int, vector<int>, greater<>> pq;
int ans = 0;
for (auto& i : v) {
if (not pq.empty() and pq.top() <= i[0])
pq.pop();
pq.push(i[1]);
ans = max(ans, (int)pq.size());
}
cout << ans;
}
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
/**
* @author Fxz
* @version 1.0
* @date 2022/8/3 15:15
*/
public class Main {
static int n;
static Node[] nodes;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
nodes = new Node[n + 5];
HashMap<Integer, Integer> map = new HashMap<>();
Set<Integer> set = new TreeSet<>();
for (int i = 0; i < n; i++) {
int s = sc.nextInt();
int e = sc.nextInt();
set.add(s);
set.add(e);
nodes[i] = new Node(s, e);
}
int cnt = 0;
for (Integer integer : set) {
map.put(integer, cnt++);
}
int[] arr = new int[set.size() + 5];
for (int i = 0; i < n; i++) {
int start = nodes[i].start;
int end = nodes[i].end;
Integer index1 = map.get(start);
Integer index2 = map.get(end);
arr[index1]++;
arr[index2]--;
}
int max = -1;
for (int i = 1; i < set.size(); i++) {
arr[i] += arr[i - 1];
max = Math.max(arr[i], max);
}
System.out.println(max);
}
static class Node implements Comparable<Node> {
int start, end;
public Node(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public int compareTo(Node o) {
return this.end - o.end;
}
}
} import java.util.*;
public class Main {
// 用的是扫描线技巧
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] start = new int[n];
int[] end = new int[n];
for (int i = 0; i < n; i++) {
start[i] = in.nextInt();
end[i] = in.nextInt();
}
Arrays.sort(start);
Arrays.sort(end);
int cnt = 0, max = 0, i = 0, j = 0;
while (i < n && j < n) {
if (start[i] < end[j]) { // 扫描到红点
cnt++;
i++;
} else { // 扫描到绿点
cnt--;
j++;
}
max = Math.max(max, cnt);
}
System.out.println(max);
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] nums = new int[n][2];
for (int i = 0; i < n; i++) {
nums[i][0] = sc.nextInt();
nums[i][1] = sc.nextInt();
}
sc.close();
Arrays.sort(nums, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]);
Queue<int[]> queue = new PriorityQueue<>((a, b) -> a[1] - b[1]);
queue.offer(nums[0]);
for (int i = 1; i < n; i++) {
int[] last = queue.peek();
if (last[1] <= nums[i][0]) {
queue.poll();
queue.offer(new int[]{last[0], nums[i][1]});
} else {
queue.offer(nums[i]);
}
}
System.out.println(queue.size());
}
}