【题解】[ABC154D] Dice in Line
题面传送门
不知为何评绿?
解决思路
首先,一颗面数已知的骰子掷出的点数期望值是固定的,假设它有 \(k\) 面,则期望为 \(\frac {\sum_{i = 1}^{k} i} k\) 。然后看数据范围,最多只有 \(10^3\) 面,所以完全可以将每个骰子的期望点数预处理出来,然后原题就变成了求最大定长子段和,用前缀和可以轻松解决。
AC Code
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0)
using namespace std;
double f[1005],s[200005],now,ans;
int n,k,a;
signed main(){
IOS;TIE;
cin>>n>>k;
for(int i=1;i<=1000;i++) now+=(double)i,f[i]=now/(double)i;
for(int i=1;i<=n;i++) cin>>a,s[i]=s[i-1]+f[a];
for(int i=k;i<=n;i++) ans=max(ans,s[i]-s[i-k]);
cout<<fixed<<setprecision(16)<<ans<<endl;
return 0;
}