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 h1∼hn
and c1∼cn
. h1∼hn
is a permutation of 1∼n
. 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>hi−1 and hi>hi+1]
Bo have gotten the value of c1∼cn
, 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(1≤n≤1000)
, second line contains n
non-negative integer ci(0≤ci≤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.
Sample Input
4
3 2 4 5
5
3 5 99 32 12
Sample Output
6.000000
52.833333
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5753
根据题意,可以考虑每个位置对期望的贡献。当i不在排列两端的时候,有3! = 6种大小关系,其中有2种对期望有贡献,因此贡献为ci/3;当i在排列两端时,有2! = 2种大小关系,其中有1种对期望有贡献,因此贡献为ci/2。(注意特判n == 1的情况)
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 }