题目链接
这题目题意理解了之后基本就很容易了。
题目大意:首先第一句话想表达的意思就是,有n个骰子。pi是pi面的骰子(由1,2…,pi组成)。第二句话表达的意思就是求连续k个相邻的骰子期望的最大和。
对于骰子期望:假设为一个6面骰,期望就为(1+2+3+4+5+6)/6。所以对于一个pi我们有(1+2+…+pi)/pi=[(1+pi)/2*pi]/pi=(1+pi)/2。(不是吧,等差数列你都看不懂吗?)
思路:用前缀和去记忆前i个骰子期望相加。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#define IOS ios::sync_with_stdio(false);cin.tie();cout.tie(0)
using namespace std;
typedef pair<int,int> pll;
typedef long long ll;
const int N=2e5+100;
const int maxn=110;
const int M=100003;
map<string,int> q;
bool st[N];
double sum[N];
int main()
{
IOS;
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
double x;
cin>>x;
sum[i]=sum[i-1]+(x+1)*0.5;
}
double ans=0;
for(int i=k;i<=n;i++)
{
ans=max(ans,sum[i]-sum[i-k]);
}
printf("%.7lf",ans);//(这里或许有人问为什么不直接输出,因为题目明确说了与正确答案误差不超过1e-6则为正确,所以就保留6位以上的小数)
return 0;
}