1. 程式人生 > >zoj 2091 Mean of Subsequence(奇怪的貪心)

zoj 2091 Mean of Subsequence(奇怪的貪心)

Mean of Subsequence
Time Limit: 2 Seconds      Memory Limit: 65536 KB
Given N numbers in a line, we can determine a continuous subsequence by giving its start position and its length.

PMH and Roy played a game the other day. Roy gives the start position first, then PMH gives the length. Roy wants the mean of the subsequence as large as possible, while PMH wants it as small as possible.

You are to calculate the best result Roy can get, assuming PMH is very clever.


Input

There are multiple testcases.

Each testcase begins with a line containing N only.

The following line contains N numbers, separated by spaces.


Output

For each testcase, you are to print the best mean of subsequece Roy can get, precise to 6 digit after decimal point.


Sample Input

10
2 10 4 6 5 10 10 2 3 2


Sample Output

5.777778

分析:說來懺愧,我並不理解為什麼是這樣:從a[i]開始的數字序列一定是a[i]--a[n]這一最長段的平均值最小,它的證明我沒有看懂:用反證法證明:如果所選長度的最後一個數字不是n  而是kmax與n中間的某個數t,那麼也就是說ave(kmax...t)<ave(kmax...n)。那麼必有 ave(t+1...n)>ave(kmax...n) 說明最後t+1個數的平均數最大,與題設矛盾。
這題可以說是我很不理解的一題。。。
#include <iostream>
#include <cstdio>
using namespace std;
double a[10005],b[10005];
int main()
{
    //freopen("cin.txt","r",stdin);
    int n,i,j;
    double maxm;
    while(cin>>n){
        for(i=1;i<=n;i++) scanf("%lf",&a[i]);
        maxm=b[n]=a[n];
        for(i=n-1;i>=1;i--){
            b[i]=(a[i]+b[i+1]*(n-i))/(n-i+1);
            maxm=max(maxm,b[i]);
        }
        printf("%.6lf\n",maxm);
    }
    return 0;
}