题目描述
有一天某人得到了一组数据,然后烦人的是,有位同学老是询问某一段区间[L,r]范围的平均值(只要整数部分)= =。某人无法解决,向你求救、
输入
多组测试,处理到文件末尾。一行一个n,m(n,m<=100000), 接下来一行n个数字(每个数小于等于200)。
再接下来是m行,每行是两个数L,R;
输出
输出答案。
样例输入
5 4
1 2 3 4 5
1 1
1 2
1 5
2 4
样例输出
1
1
3
3
解析:倘若每次遍历相加,会超时。因此我们要利用前缀和方法来解决。
前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。 设sum[]为前缀和数组,k[]为原数组,因此sum[i]=sum[i-1]+k[i],然后我们输入区间a,b,区间和就是sum[b]-sum[a-1]。
#include <stdio.h>
int k[100005],sum[100005];//k为原数组,sum为前缀和数组
int main()
{int n,l,i,a,b,he;while(~scanf("%d%d",&n,&l)){for(i=1;i<=n;i++) scanf("%d",&k[i]);//我是直接下标1开始,后面方便点 sum[0]=0; sum[1]=k[1];for(i=2;i<=n;i++) sum[i]=sum[i-1]+k[i];//前缀和存储 for(i=0;i<l;i++){scanf("%d%d",&a,&b);he=sum[b]-sum[a-1];printf("%d\n",he/(b-a+1));}}return 0;
}