广联达 8.31 笔试

给定座位数 N,编号 1 ~ n,以及 m 个规则,规则规定座位编号 l 到 r 可坐 x 人

示例输入:

14 4 1 3 2 4 7 3 6 10 2 10 14 3

输出:

 10

图解说明:

记录每一区间不可坐的位置数目,累加。如{1 3 2} 中 ,有一个位置不可坐,noAns += 1。


由于不知道下一区间是否会与当前区间重叠,所以不可坐位置数目还有另外的作用。

发生重叠时:

计算当前区间总共可坐的位置数

  1. 不重叠的座位数,如图中{8 9 10}

  2. 重叠座位{6 7} 以及可以坐的位置数{7}

总共 4 位。

问题来了,因为上一区间不知道下一区间会重叠,因此累加了不可坐位置数,要进行补偿。

上一区间{4 7 3},不可坐位置数 1,并在重叠区间(即当前区间)利用了 1 个位置,那么,总不可坐位置数 - 1


import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] rules = new int[m][3];

        for(int i = 0; i < m; i++) {
            rules[i][0] = sc.nextInt();
            rules[i][1] = sc.nextInt();
            rules[i][2] = sc.nextInt();
        }
        sc.close();

        Arrays.sort(rules, new Comparator<int[]>() { 
                        @Override    public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });

        int allSit = rules[0][1] - rules[0][0] + 1;
        int noSit = allSit - rules[0][2];
        int noAns = noSit;
        for(int i = 1; i < m; i++) {
            if(rules[i-1][1] >= rules[i][0]) {
                allSit = rules[i][1] - rules[i-1][1] + Math.min(rules[i-1][1] - rules[i][0] + 1, noSit);
                noAns -= Math.min(rules[i - 1][1] - rules[i][0] + 1, noSit);
            }else{
                allSit = rules[i][1] - rules[i][0] + 1;
            }
            noSit = allSit - rules[i][2];
            noAns += noSit;
        }
        System.out.println(noAns);
        int ans = n - noAns;
        System.out.println(ans);

    }
}



全部评论
兄弟a了吗
点赞 回复 分享
发布于 2022-09-01 16:42 浙江
5 2 1 3 2 1 4 1 你试试这个能不能得到2?
1 回复 分享
发布于 2022-09-01 15:18 湖北

相关推荐

我即大橘:耐泡王
点赞 评论 收藏
分享
评论
1
11
分享
牛客网
牛客企业服务