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