https://ac.nowcoder.com/acm/contest/4010/A
这道题枚举区间长度的贡献值;
当区间长度为1时,就是所有元音数的个数;
当区间长度为2时,区间【2,n-1】的数贡献了两次;
以此类推;
那么为什么可以这样做呢。
举个例子:当区间长度为2时,答案就是 (该区间元音个数)/区间长度+(该区间元音个数)/区间长度+(该区间元音个数)/区间长度+·······;
化简式子,就能得出,(区间总的元音个数/区间长度)就是当区间长度为2时的答案;
于是我们需要枚举出区间长度为1~n时的各个答案;
最后算出来的答案再除以总的枚举个数(n*(n+1)/2);
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int N = 1000005;
4 int n;
5 char str[N];
6 int a[N];
7
8 int main() {
9 scanf("%s",str+1);
10 n=strlen(str+1);
11 for(int i=1;i<=n;i++) {
12 if(str[i]=='a' || str[i]=='e' || str[i]=='i'
13 || str[i]=='o' || str[i]=='u' || str[i]=='y')
14 a[i]=a[i-1]+1;
15 else a[i]=a[i-1];
16 }
17 double ans = 0;
18 double tmp = 0;
19 for(int i=1;i<=n;i++){
20 if(i==1) tmp=a[n];
21 else tmp+=a[n-i+1]-a[i-1];
22 ans += tmp/i;
23 }
24 printf("%.8lf",ans/n/(n+1)*2);
25 }
来源:https://www.cnblogs.com/pangbi/p/12291938.html