hdu 中位數計數
阿新 • • 發佈:2018-11-07
中位數計數
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;
}