题目:
给定a1……an一共N个整数,有M次查询,每次需要查询区间【L,R】的和。
示例:
输入:
5 3
1 2 3 4 5
1 3
3 3
4 5输出:
6
3
9
实现:
最开始我把代码写成
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<stdio.h>
#include<malloc.h>
int main()
{
int n, m, l, r;
scanf("%d%d", &n, &m);
int* s;
s = (int*)malloc(sizeof(int) * n);
assert(s != NULL);
for (int i = 1; i < n+1; i++)
{
scanf("%d", &s[i]);
}
while (m--)
{
int sum = 0;
scanf("%d%d", &l, &r);
for (int i = l; i <= r; i++)
{
sum += s[i];
}
printf("%d\n", sum);
}
free(s);
}
但是很遗憾示例过了最后无法提交,所以为了减小时间复杂度更改了一下算法
将a[i]改为a[i]+a[i-1],这样每一个元素都会变成前面一个与自己相加。上代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
int main()
{
int N, M, L, R, sum = 0;
int* a;
scanf("%d%d", &N, &M);
a = (int*)malloc(sizeof(int) * N);
assert(a != NULL);
for (int i = 1; i <= N; i++)
{
scanf("%d", &a[i]);
}
for (int i = 1; i <= N; i++)
a[i] += a[i - 1];
for (int j = 0; j < M; j++)
{
scanf("%d%d", &L, &R);
printf("%d\n", a[R] - a[L - 1]);
}
free(a);
return 0;
}