HDU5753 Permutation Bo(2016多校训练)
Permutation Bo
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 777 Accepted Submission(s): 468
Special Judge
Problem Description
There are two sequences h
1
∼h
n![]()
and c
1
∼c
n![]()
. h
1
∼h
n![]()
is a permutation of 1∼n
. particularly, h
0
=h
n+1
=0
.
We define the expression [condition]
is 1 when condition
is True,is 0 when condition
is False.
Define the function f(h)=∑
n
i=1
c
i
[h
i
>h
i−1
and h
i
>h
i+1
]
Bo have gotten the value of c
1
∼c
n![]()
, and he wants to know the expected value of f(h)
.
We define the expression [condition]
Define the function f(h)=∑
Bo have gotten the value of c
Input
This problem has multi test cases(no more than 12
).
For each test case, the first line contains a non-negative integer n(1≤n≤1000)
, second line contains n
non-negative integer c
i
(0≤c
i
≤1000)
.
For each test case, the first line contains a non-negative integer n(1≤n≤1000)
Output
For each test cases print a decimal - the expectation of f(h)
.
If the absolute error between your answer and the standard answer is no more than 10
−4![]()
, your solution will be accepted.
If the absolute error between your answer and the standard answer is no more than 10
Sample Input
4
3 2 4 5
5
3 5 99 32 12
Sample Output
6.000000
52.833333
根据题意,可以考虑每个位置对期望的贡献。当i不在排列两端的时候,有3! = 6种大小关系,其中有2种对期望有贡献,因此贡献为ci/3;当i在排列两端时,有2! = 2种大小关系,其中有1种对期望有贡献,因此贡献为ci/2。(注意特判n == 1的情况)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <string> 6 using namespace std; 7 typedef long long ll; 8 typedef unsigned long long ull; 9 typedef long double ld; 10 #define MAX 1005 11 12 int n; 13 int c[MAX]; 14 double ans; 15 void solve() 16 { 17 for(int i=1;i<=n;i++) 18 cin >> c[i]; 19 if(n==1) 20 { 21 ans = c[1]; 22 return; 23 } 24 if(n==2) 25 { 26 ans = (c[1]+c[2])/2.0; 27 return; 28 } 29 ans = 0; 30 for(int i=2;i<n;i++) 31 ans += (c[i])/3.0; 32 ans+=c[1]/2.0; 33 ans+=c[n]/2.0; 34 } 35 int main() 36 { 37 while(~scanf("%d",&n)) 38 { 39 solve(); 40 printf("%.6f\n",ans); 41 } 42 return 0; 43 }