2020 CCPC比赛

落爺英雄遲暮 提交于 2020-02-10 18:39:14

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 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!