4 solutions
-
1
解题报告
撰写人: 钟志杰
题意分析
这道题如果直接用暴力就会超时,所以我们要用第二种方法,那就是前缀和!
难度等级
★☆☆☆☆
解题思路
这道题重点在于前缀和,那么前缀和是什么呢?前缀和如下:
前缀和指的是从a[1]加到a[i]的值,其实只要用k[i]=k[i-1]+a[i]即可(k为前缀和数组)
求从a到b就简单了!
只要用k[b]-k[a-1],就可以了,记住:k[a-1]不要写成k[a]了!解题反思
无
参考程序
#include<bits/stdc++.h> #define LL long long using namespace std; LL n,m,x,s[100005],l,r; int main(){//主函数 cin>>n>>m; for(int i=1;i<=n;i++){ cin>>x; s[i]=s[i-1]+x;//计算前缀和 } for(int i=1;i<=m;i++){ cin>>l>>r; cout<<s[r]-s[l-1]<<endl;//把l到r的值算出来 } return 0; } -
0
小朋友,咱们一起来看看这道题哈。题目说要输入一个长度为n的整数序列,然后还有m个询问,每个询问会告诉咱们从第l个数到第r个数,让咱们算出这中间数的和。咱们可以用前缀和的方法来解决这个问题哦。啥是前缀和呢,就好比咱们有一排小积木,每个积木都有自己的数字,前缀和就是从第一个积木开始一直加到当前这个积木的数字总和。
接下来呀,我给你一步步讲怎么解题。 第一步,咱们得先读取整数序列的长度n和询问的次数m。 第二步呢,把整数序列存起来,同时算出前缀和。 第三步,对于每个询问,用前缀和相减就能得到答案啦。
下面我给你看看对应的C++代码。
#include<bits/stdc++.h> // 这是万能头文件,能帮咱们用好多东西哦 using namespace std; int main() { int n, m; cin >> n >> m; // 读取n和m,就像咱们知道有多少个小积木和要问几次问题 int a[100005]; // 用来存整数序列的数组,就像一个小盒子,能装好多数字 int s[100005] = {0}; // 存前缀和的数组,初始都为0 for (int i = 1; i <= n; i++) { cin >> a[i]; // 把每个小积木上的数字放到盒子里 s[i] = s[i - 1] + a[i]; // 算前缀和,就像从第一个积木一直加到当前这个积木的总和 } for (int i = 0; i < m; i++) { int l, r; cin >> l >> r; // 读取每个询问的l和r,就是从第几个积木到第几个积木 cout << s[r] - s[l - 1] << endl; // 用前缀和相减得到答案,就像把后面一段积木的总和减去前面一段积木的总和,剩下的就是中间这段积木的总和啦 } return 0; }这样,咱们就能把每个询问的结果算出来啦。
- 1
Information
- ID
- 598
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- (None)
- # Submissions
- 94
- Accepted
- 33
- Uploaded By