本文主要是介绍大学里的树木要维护(蓝桥杯),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 大学里的树木要维护
- 题目描述
- 前缀和
大学里的树木要维护
题目描述
教室外有 N 棵树(树的编号从 1∼N),根据不同的位置和树种,学校已经对其进行了多年的维护。
因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。
由于已经维护了多年,每一个树都由学校的园艺人员进行了维护费用的统计。
每棵树的前期维护费用各不相同,但是由于未来需要要打药,所以有些树木的维护费用太高的话,就要重新种植。
由于维护费用也称区间分布,所以常常需要统一个区间里的树木的维护开销。
现给定一个长度为 N 的数组 A 以及 M 个查询,A i表示第 i 棵树到维护费用。对于每个查询包含一个区间,园艺人员想知道该区间内的树木维护的开销是多少。
请你编写程序帮帮他!
输入描述
每组输入的第一行有两个整数 N和 M。N 代表马路的共计多少棵树,M 代表区间的数目,N 和 M 之间用一个空格隔开。
接下来的一行,包含 N 个数 A 1 ,A 2,⋯,A N ,分别表示每棵树的维护费用,每个数之间用空格隔开。
接下来的 M 行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点 L 和终止点 R 的坐标。
输出描述
输出包括 M 行,每一行只包含一个整数,表示维护的开销。
输入输出样例
示例
输入
10 3
7 5 6 4 2 5 0 8 5 3
1 5
2 6
3 7
输出
24
22
17
前缀和
#include<bits/stdc++.h> // 包含大部分标准库
using namespace std;const int z = 1e6 + 10; // 设置数组的最大长度,因为数据范围是1≤N≤10^6^
int a[z], s[z]; // a是用来存储每棵树的维护费用的数组,s是维护费用的前缀和数组int main()
{int n, m; // n代表树木的总数,m代表区间的数目scanf("%d %d", &n, &m); // 读入n和mfor(int i = 1; i <= n; i++){scanf("%d", &a[i]); // 读入每棵树的维护费用s[i] = s[i - 1] + a[i]; // 计算维护费用的前缀和数组}while(m--){int l, r; // l代表区间的起始点,r代表区间的终止点scanf("%d %d", &l, &r); // 读入区间信息printf("%d\n", s[r] - s[l - 1]); // 输出区间内的维护开销,即维护费用的前缀和之差}return 0;
}
这段代码的核心思想是前缀和数组。前缀和数组是一种特殊的数组,它记录了数组中每个位置之前所有元素的累加和。在本题中,我们可以将树木的位置看作一条直线,使用前缀和数组来记录每个位置的维护费用的累计和。
首先,读入树木的总数n和区间的数目m。然后,对每棵树进行处理,读入每棵树的维护费用,并计算维护费用的前缀和数组。每个位置的维护费用的累计和等于前一个位置的累计和加上该位置的维护费用。
接下来,对每个区间进行处理。对于每个区间,我们输出该区间内的维护开销,即维护费用的前缀和数组中终止点的值减去起始点之前的值。
最后,输出每个区间的维护开销。
这篇关于大学里的树木要维护(蓝桥杯)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!