1.需求背景:新增数据,判断同一个时间范围内最大的重叠数量不能超过n个
相似解及方法的题目
HDU 1050 Moving Tables
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n, u;
n = in.nextInt();
for (int i = 0; i < n; i++) {
u = in.nextInt();
int array[][] = new int[u][2];
for (int j = 0; j < u; j++) {
array[j][0] = (in.nextInt() + 1) / 2;//相邻的奇数和偶数化成同一坐标
array[j][1] = (in.nextInt() + 1) / 2;
if (array[j][0] > array[j][1]) {
int tmp = array[j][0];
array[j][0] = array[j][1];
array[j][1] = tmp;
}
}
System.out.println(getMaximum(array, u));
}
}
/**
* 区间重合的最大个数
* @param
* @return 最大重叠个数
*/
private static int getMaximum(int array[][], int u) {
Arrays.sort(array, (s, e) ->{
if (s[1] > e[1])
return 1;
else if (s[1] < e[1])
return -1;
return 0;
});
int max = 0;
for (int i = 0; i < u; i++) {
int end = array[i][1];
int temp = 10;
for (int j = i + 1; j < u; j++) {
if (array[j][0] <= end) {
temp += 10;
if (end > array[j][1]) {
end = array[j][1];
}
}
}
max = temp > max ? temp : max;
}
return max;
}
}
参考别人的其他特殊解及方法:
#include <iostream>
using namespace std;
int main()
{
int t;
int cover[200];
cin >> t;
while (t--) {
memset(cover, 0, sizeof(cover));
int n, s, f;
cin >> n;
while (n--) {
cin >> s >> f;
s = (s - 1) / 2; //相邻的奇数和偶数化成同一坐标
f = (f - 1) / 2;
if (s > f)
s ^= f ^= s ^= f;
for (int i = s; i <= f; ++i)
cover[i]++;
}
int max = -1;
for (int i = 0; i < 200; ++i) {
if (cover[i] > max)
max = cover[i];
}
cout << max * 10 << endl;
}
return 0;
}