当前位置: 代码迷 >> 综合 >> ZCMU--1658: O__O “… 就是那道中文题(C语言)
  详细解决方案

ZCMU--1658: O__O “… 就是那道中文题(C语言)

热度:31   发布时间:2023-12-06 10:11:41.0

题目描述

有一天某人得到了一组数据,然后烦人的是,有位同学老是询问某一段区间[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;
}