• 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
  • 相关阅读:
    jQuery的简单实用的25个知识点
    toDoList案例
    缓动动画函数的封装
    轮播图的设置:
    Django学习:cookie和session
    Django学习:ORM
    Django学习:中间件
    Django学习:url路由系统
    Django学习:模板继承和配置静态文件
    Django学习:模板语法
  • 原文地址:https://www.cnblogs.com/GraceSkyer/p/8782480.html
Copyright © 2020-2023  润新知