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 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 of f(h) .

If the absolute error between your answer and the standard answer is no more than 104 , your solution will be accepted.
 
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的情况)
 
 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 }
View Code

 

posted @ 2016-08-01 23:48  Mino521  阅读(162)  评论(0编辑  收藏  举报