一 503. 借教室 (差分|二分)

503. 借教室 (差分|二分)
image


思路:使用二分法遍历目前为止订单是否满足,分为[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);
        }
    }
}
posted @   he0707  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示