一 503. 借教室 (差分|二分)
思路:使用二分法遍历目前为止订单是否满足,分为[left, mid-1]和[mid, right]两部分,同时订单是在连续区间内加上相同值,所以利用差分法,在新的diff数组的左右边界操作,然后累加判断n天内教室是否满足订单。
import java.util.*;
public class Main {
private static int n, m;
private static int[] rooms;
private static int[][] orders;
private static boolean check(int mid) {
long[] diff = new long[n + 2];
for (int i = 1; i <= mid; i++) {
diff[orders[i][1]] += orders[i][0];
diff[orders[i][2] + 1] -= orders[i][0];
}
long sum = 0;
for (int i = 1; i <= n; i++) {
sum += diff[i];
if (sum > rooms[i]) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
rooms = new int[n + 1];
for (int i = 1; i <= n; i++) {
rooms[i] = sc.nextInt();
}
orders = new int[m + 1][3];
for (int i = 1; i <= m; i++) {
orders[i][0] = sc.nextInt();
orders[i][1] = sc.nextInt();
orders[i][2] = sc.nextInt();
}
int left = 1, right = m;
while (left < right) {
int mid = left + right + 1 >> 1;
if (check(mid)) {
left = mid;
}
else {
right = mid - 1;
}
}
if (right == m) {
System.out.println("0");
}
else {
System.out.println("-1");
System.out.println(left + 1);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律