hdu5753(2016多校第三场,数学题)

来源:互联网 发布:mysql 高级sql语句 编辑:程序博客网 时间:2024/06/06 04:53

Permutation Bo

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 593    Accepted Submission(s): 360
Special Judge


Problem Description
There are two sequences h1hn and c1cn.h1hn is a permutation of 1n. particularly, h0=hn+1=0.

We define the expression [condition] is 1 when condition is True,is 0 when condition is False.

Define the function f(h)=ni=1ci[hi>hi1  and  hi>hi+1]

Bo have gotten the value of c1cn, and he wants to know the expected value of f(h).
 

Input
This problem has multi test cases(no more than 12).

For each test case, the first line contains a non-negative integer n(1n1000), second line contains n non-negative integer ci(0ci1000).
 

Output
For each test cases print a decimal - the expectation off(h).

If the absolute error between your answer and the standard answer is no more than104, your solution will be accepted.
 

Sample Input
43 2 4 553 5 99 32 12
 

Sample Output
6.00000052.833333

题意不多描述了,很容易理解。

思路:对每个位置求总共出现的次数,然后和n!求一个比值,最终的结果就是第i个数乘以第i个比值,可是很巧妙的发现是第一个位置和最后一个位置总是1/2,中间的总是1/3

。所以当大于等于3的时候直接把两端乘以0.5,其他数乘以0.33333333就好,然后就是只有一个数的时候单独判断一下就好……

这份代码是推的公式算的,其实最终的结果都是两边是1/2,中间是1/3.

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <vector>using namespace std;int n;int a[100005];int main(){    while(~scanf("%d",&n))    {        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        double quan=0;        if(n==1)        {            printf("%.6f\n",a[0]*1.0);        }        else if(n==2)        {            double sun=0;            for(int i=0;i<2;i++)            {                sun+=a[i]/2.0;            }            printf("%.6f\n",sun);        }        else        {            quan=0;            for(int i=2;i<n;i++)                quan+=i*(i-1);            quan/=n*(n-1)*(n-2);            double sum=0;            sum+=a[0]/2.0;            sum+=a[n-1]/2.0;            for(int i=1;i<n-1;i++)                sum+=a[i]*quan;            printf("%.6lf\n",sum);            //cout<<"--quan:  "<<quan<<endl;        }    }    return 0;}


0 0
原创粉丝点击