33,010
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <vector>
#include <cmath>
#include <cstdio>
using namespace std;
double SortCow(int * h,int * left,int * right,int n)
{
int i;
for(i = 1;i<n;i++)
{
int now = i-1;
while(now != n && h[now] <= h[i])
now = left[now];
if(now != n)
left[i] = now;
}
double sum = 0;
if(left[n-1] != n)
sum+=n-1-left[n-1];
else
sum+=n;
for(i =n-2;i>=0;i--)
{
int now = i+1;
while(now != n && h[now] <= h[i])
now = right[now];
if(now != n)
right[i] = now;
if(right[i] != n && left[i]!=n)
sum += (i-left[i])<(right[i]-i)?(i-left[i]):(right[i]-i);
else if(left[i] == n && right[i] == n)
sum += n;
else if(left[i] == n && right[i] !=n)
sum += right[i]-i;
else
sum+= i-left[i];
}
return sum;
}
int main()
{
int n;
vector<double> re;
while(cin>>n)
{
int * h = new int[n];
int * left = new int[n];
int * right = new int[n];
int i;
for(i = 0;i<n;i++)
{
cin>>h[i];
left[i] = right[i] = n;
}
re.push_back(SortCow(h,left,right,n)/n);
delete[] h;
delete[] left;
delete[] right;
}
vector<double>::iterator it;
for(it = re.begin();it!=re.end();it++)
printf("%.2f\n",*it);
return 0;
}