【蓝桥杯】试题 算法提高 分苹果

问题描述

小朋友排成一排,老师给他们分苹果。小朋友从左到右标号1…N。有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li+1个小朋友每人发Ci个苹果。最后老师想知道每个小朋友有多少苹果。

输入格式

第一行两个整数N、M,表示小朋友个数和老师个数。
接下来M行,每行三个整数Li、Ri、Ci,意义如题目表述。

输出格式

一行N个数,第i个数表示第i个小朋友手上的水果。

样例输入

5 3
1 2 1
2 3 2
2 5 3

样例输出

1 6 5 3 3

分析

巧用数组下标,很容易解决问题。

代码

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int m =sc.nextInt();
    int[][] arr = new int[m][3];
    int[] result = new int[n];

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < 3; j++) {
            arr[i][j] = sc.nextInt();
        }
        for (int j = arr[i][0] - 1; j < arr[i][1]; j++) {
            result[j] += arr[i][2];
        }
    }
    for (int a : result) {
        System.out.print(a + " ");
    }

    sc.close();
}

结果

运行超时

想了想事情没那么简单

优化

想不到好方法,真的菜,就去借鉴了大佬的思路,顿时豁然开朗…

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int m =sc.nextInt();
    int[] arr = new int[n];
    int li, ri, ci;

    for (int i = 0; i < m; i++) {
        li = sc.nextInt();
        ri = sc.nextInt();
        ci = sc.nextInt();
        //li比li的前一个多ci
        arr[li-1] += ci;
        //ri的后一个比ri少ci
        if (ri < n) {
            arr[ri] -= ci;
        }
    }

    int count = 0;
    for (int i = 0; i < n; i++) {
        count += arr[i];
        System.out.print(count + " ");
    }

    sc.close();
}

发布了6 篇原创文章 · 获赞 0 · 访问量 47

猜你喜欢

转载自blog.csdn.net/qq_40930715/article/details/105055035