宁波市第31届中小学生计算机程序设计竞赛 |
问题 E: 平均值I
题目描述
豆豆从小对数字很敏感,小学里就显露出超常的能力,老师为了防止他太过骄傲,给了他一个可怕的难题:求一串给定整数某一段的平均值,保留3位小数。每个整数都是小于231的。老师做梦也没想到豆豆全都回答出来了,原来豆豆有一个擅长编程的朋友你。
输入
第一行一个整数N(1<=N<=100000),表示一串整数的个数;
第二行用空格隔开的N个非负整数;
第三行一个整数M(1<=M<=100000),表示M次询问;
接下来M行,每行两个整数i和j(1<=i,j<=N),表示询问第i个到第j个整数的平均值,不保证i<j。
输出
M行,每行一个小数,表示平均值,要求小数点后面保留3位输出。
样例输入
5
0 25 0 23 2
1
1 5
样例输出
10.000
提示
数据保证N个整数和小于263
----------------------------------------------2018-10-28-------
-行吧,以前写的并不是树状数组,嘛,能A就行,其实这题直接存前缀和就行
----------------------------------------------------------------------------------------------------
本题Ac代码
#include<bits/stdc++.h>
#define forr(i,n) for(int i=0;i<n;i++)
#define ms(a) memset(a,0,sizeof(a))
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
ll a[100005];
double ans[100005];
ll sss(ll x)
{
if(x==1)
return a[1];
if(x%2)
return a[x]+a[x-1];
return a[x];
}
ll ss(ll x,ll y)//求和
{
if(!x)
return sss(y);
return sss(y)-sss(x-1);
}
int main()
{
ms(a),ms(ans);
ll n,m;
cin>>n;
for(int i=1;i<=n;i++)
{
ll t;
cin>>t;
if(i%2)
a[i]=t;
else
{
a[i]=a[i-2]+a[i-1]+t;
}
}
cin>>m;
forr(i,m)
{
ll x,y;
cin>>x>>y;
if(x>y)
{
ll tem=x;
x=y,y=tem;
}
ans[i]=ss(x,y);
ans[i]/=(y-x+1);
}
forr(i,m)printf("%.3lf\n",ans[i]);
//forr(i,n)
//printf("%d\t",a[i+1]);
return 0;
}