You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package class40;
import java.util.Arrays;
import java.util.PriorityQueue;
// 给定int[][] meetings比如
// {
// {66, 70} 0号会议截止时间66获得收益70
// {25, 90} 1号会议截止时间25获得收益90
// {50, 30} 2号会议截止时间50获得收益30
// }
// 一开始的时间是0任何会议都持续10的时间但是一个会议一定要在该会议截止时间之前开始
// 只有一个会议室,任何会议不能共用会议室,一旦一个会议被正确安排,将获得这个会议的收益
// 请返回最大的收益
public class Code03_MaxMeetingScore {
public static int maxScore1(int[][] meetings) {
Arrays.sort(meetings, (a, b) -> a[0] - b[0]);
int[][] path = new int[meetings.length][];
int size = 0;
return process1(meetings, 0, path, size);
}
public static int process1(int[][] meetings, int index, int[][] path, int size) {
if (index == meetings.length) {
int time = 0;
int ans = 0;
for (int i = 0; i < size; i++) {
if (time + 10 <= path[i][0]) {
ans += path[i][1];
time += 10;
} else {
return 0;
}
}
return ans;
}
int p1 = process1(meetings, index + 1, path, size);
path[size] = meetings[index];
int p2 = process1(meetings, index + 1, path, size + 1);
// path[size] = null;
return Math.max(p1, p2);
}
public static int maxScore2(int[][] meetings) {
Arrays.sort(meetings, (a, b) -> a[0] - b[0]);
PriorityQueue<Integer> heap = new PriorityQueue<>();
int time = 0;
// 已经把所有会议,按照截止时间,从小到大,排序了!
// 截止时间一样的,谁排前谁排后,无所谓
for (int i = 0; i < meetings.length; i++) {
if (time + 10 <= meetings[i][0]) {
heap.add(meetings[i][1]);
time += 10;
} else {
if (!heap.isEmpty() && heap.peek() < meetings[i][1]) {
heap.poll();
heap.add(meetings[i][1]);
}
}
}
int ans = 0;
while (!heap.isEmpty()) {
ans += heap.poll();
}
return ans;
}
public static int[][] randomMeetings(int n, int t, int s) {
int[][] ans = new int[n][2];
for (int i = 0; i < n; i++) {
ans[i][0] = (int) (Math.random() * t) + 1;
ans[i][1] = (int) (Math.random() * s) + 1;
}
return ans;
}
public static int[][] copyMeetings(int[][] meetings) {
int n = meetings.length;
int[][] ans = new int[n][2];
for (int i = 0; i < n; i++) {
ans[i][0] = meetings[i][0];
ans[i][1] = meetings[i][1];
}
return ans;
}
public static void main(String[] args) {
int n = 12;
int t = 100;
int s = 500;
int testTime = 10000;
System.out.println("测试开始");
for (int i = 0; i < testTime; i++) {
int size = (int) (Math.random() * n) + 1;
int[][] meetings1 = randomMeetings(size, t, s);
int[][] meetings2 = copyMeetings(meetings1);
int ans1 = maxScore1(meetings1);
int ans2 = maxScore2(meetings2);
if (ans1 != ans2) {
System.out.println("出错了!");
System.out.println(ans1);
System.out.println(ans2);
}
}
System.out.println("测试结束");
}
}