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 }