这道题要求求数组的区间和。目前我有两种方法:1.遍历2.前缀和
方法一:代码如下
#include<stdio.h>
int main()
{
long long n;
scanf("%lld", &n);
long long arr[100000] = { 0 };
long long i = 0;
long long sum = 0;
for (i = 0; i < n; i++)
{
scanf("%lld", &arr[i]);
}
long long p;
scanf("%lld\n", &p);
long long a = 0, b = 0;
int j = 0;
for (j = 0; j < p; j++)
{
scanf("%lld %lld", &a, &b);
sum = 0;
for (i = a-1; i < b; i++)
{
sum += arr[i];
}
printf("%lld\n", sum);
}
return 0;
}
总结:这种方法容易理解并且简单,但是速度太慢且低效。
方法二:代码如下
#include<stdio.h>
int main()
{
int n = 0;
int i = 0, p = 0;
int a = 0, b = 0;
int m=0;
long long sum[100000] = { 0 };
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
scanf("%d", &m);
sum[i] = sum[i - 1] + m;
}
scanf("%d\n", &p);
for (i = 1; i <= p; i++)
{
scanf("%d %d", &a, &b);
int max = 0,min = 0;
max = (a > b ? a : b);
min = (a < b ? a : b);
printf("%lld\n", (sum[max] - sum[min - 1]));
}
return 0;
}
总结:用前缀和提高了效率,优化了代码。
可能还有更好的方法还等着我去学习,任重而道远。