-
CodeForces 808B-Average Sleep Time
-
题目链接:B. Average Sleep Time
-
思路:
给了n天睡眠时间,给了个计算公式,从第一天开始每k天之和/(n-k+1) 类似滑动窗口吧,保留10位小数
水题,但是如果每次都去求前k个和,会TL
每次窗口只移动一个单位,也就是最左一个被舍弃,再从最右进一个,所以求第一个前k和,后面每求和一次就减去最左,加入最右就ok
-
代码:
#include<iostream>
#include<iomanip>
#include<cstdio>
#define MAX_SIZE 200005
using namespace std;
int main()
{
int n,k;
double Sleep[MAX_SIZE];
double Res=0.0;
double Part=0.0;
cin>>n>>k;
int W=n-k+1;
for(int i=0;i<n;i++)
{
scanf("%lf",&Sleep[i]);
if(i<k)
Part+=Sleep[i]/(W*1.0); //窗口初始求和
}
for(int i=0;i<n-k+1;i++)
{
if(i==0)
{
Res=Part;
continue;
}
Part-=Sleep[i-1]/(W*1.0); //减去最左
Part+=Sleep[i+k-1]/(W*1.0); //加入最右
Res+=Part;
}
cout<<fixed<<setprecision(10)<<Res<<endl;
}