hdu 中位数计数

                                            中位数计数

Time Limit : 12000/6000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other)

Total Submission(s) : 11   Accepted Submission(s) : 5

Problem Description

中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数。

现在有$n$个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数。

Input

多组测试数据 第一行一个数$n(n\leq 8000)$ 第二行$n$个数,$0\leq $每个数$\leq 10^{9}$,

Output

$N$个数,依次表示第$i$个数在多少包含其的区间中是中位数。

Sample Input

5 1 2 3 4 5

Sample Output

1 2 3 2 1

Source

2016"百度之星" - 初赛(Astar Round2B)

题解:

给出一个n,以下是n个数,计算每个数是中位数的可能情况,前提是每个数的位置不变。

例如:1 2 3 4 5

          当i=3时,向右遍历,遇到比它大的加一,遇到比它小的减一,a[4]>a[3],则s[p+1]=1,a[5]>a[3],则s[p+2]=1;

         向左遍历,a[2]<a[3],遇到比它小的加一,遇到比它大的减一,则s[p+1]=1,所以,sum+1,a[1]<a[3],则s[p+2]=1,所以sum+1+1;

#include<cstdio>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int const MAX=8005;
int const p=8000;
int a[MAX],s[8005*2];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++)
        {
            int sum=0,ans=0;
            memset(s,0,sizeof(s));
            s[p]++;
            for(int j=i+1;j<=n;j++)
            {
                if(a[j]>a[i])
                    ans+=1;
                else
                    ans+=-1;
                s[p+ans]++;
            }
            ans=0;
            sum+=s[p];
            for(int j=i-1;j>=1;j--)
            {
                if(a[j]<a[i])
                    ans+=1;
                else
                     ans+=-1;
                sum+=s[p+ans];
            }
            printf("%d",sum);
            if(i==n)
            printf("\n");
            else
                printf(" ");
        }
    }
    return 0;
}

        

猜你喜欢

转载自blog.csdn.net/smilelingling/article/details/83240630