问题描述
小朋友排成一排,老师给他们分苹果。小朋友从左到右标号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();
}
扫描二维码关注公众号,回复:
10890744 查看本文章