zoukankan      html  css  js  c++  java
  • 51 nod 1682 中位数计数

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1682

    1682 中位数计数

    基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

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

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

    Input
    第一行一个数n(n<=8000)
    第二行n个数,0<=每个数<=10^9
    Output
    N个数,依次表示第i个数在多少包含其的区间中是中位数。
    Input示例
    5
    1 2 3 4 5
    Output示例
    1 2 3 2 1

    题解:一个数x如果在区间[l,r]中是中位数,用a[i]表示在区间[1,i]中比x小的数的数量,用b[i]表示在区间[1,i]中比x小的数的数量,则有a[r]-a[l]==b[r]-b[l],将之转换即得a[r]-b[r]==a[l]-b[l],然后复杂度O(n^2)就能做了。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N = 8005;
     4 int x[N], a[N*2], ans[N];
     5 int main() {
     6     int n, i, j, sum;
     7     scanf("%d", &n);
     8     for(i = 1; i <= n; ++i) scanf("%d", &x[i]);
     9     for(i = 1; i <= n; ++i) {
    10         memset(a, 0, sizeof(a));
    11         a[8000] = 1;
    12         sum = 0;
    13         for(j = 1; j < i; ++j) {
    14             if(x[j] < x[i]) sum++;
    15             else if(x[j] > x[i]) sum--;
    16             a[8000+sum]++;
    17         }
    18         for(j = i; j <= n; ++j) {
    19             if(x[j] < x[i]) sum++;
    20             else if(x[j] > x[i]) sum--;
    21             ans[i] += a[8000+sum];
    22         }
    23     }
    24     for(i = 1; i < n; ++i) printf("%d ", ans[i]);
    25     printf("%d
    ", ans[n]);
    26     return 0;
    27 }
    View Code
  • 相关阅读:
    Windows下的免安装版MySQL配置
    spket插件安装并设置JQuery自动提示
    js生成条形码——JsBarcode
    金明的预算方案
    文化之旅
    方格取数
    天使的起誓
    最大差值
    A%B Problem
    取数游戏
  • 原文地址:https://www.cnblogs.com/GraceSkyer/p/8782480.html
Copyright © 2011-2022 走看看