zoukankan      html  css  js  c++  java
  • 无序数组的中位数(set+deque)hdu5249

    KPI

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 901    Accepted Submission(s): 398

    Problem Description
    你工作以后, KPI 就是你的全部了. 我开发了一个服务,取得了很大的知名度。数十亿的请求被推到一个大管道后同时服务从管头拉取请求。让我们来定义每个请求都有一个重要值。我的KPI是由当前管道内请求的重要值的中间值来计算。现在给你服务记录,有时我想知道当前管道内请求的重要值得中间值。
     
    Input
    有大约100组数据。

    每组数据第一行有一个n(1n10000),代表服务记录数。

    接下来有n行,每一行有3种形式
      "in x": 代表重要值为x(0x109)的请求被推进管道。
      "out": 代表服务拉取了管道头部的请求。
      "query: 代表我想知道当前管道内请求重要值的中间值. 那就是说,如果当前管道内有m条请求, 我想知道,升序排序后第floor(m/2)+1th 条请求的重要值.

    为了让题目简单,所有的x都不同,并且如果管道内没有值,就不会有"out"和"query"操作。
     
    Output
    对于每组数据,先输出一行

    Case #i:
    然后每一次"query",输出当前管道内重要值的中间值。
     
    Sample Input
    6
    in 874
    query
    out
    in 24622
    in 12194
    query
     
    Sample Output
    Case #1:
    874
    24622
     

     分析:题目中说有值的加入和值的取出,首先可以用双端队列维护一个队列请求,即先进先出,用q.front()和q.pop_front()读取和删除队列头元素,用q.back()和q.push_back()读取和加入队尾元素,而维护队列的有序可以用set容器,分别建立两个容器sa和sb,无论是删除和加入元素的时候保证size(sa)==size(sb)或者size(sb)+1==size(sb);则sb.begin()  就是中位数的值

    程序:

     1 #include"stdio.h"
     2 #include"string.h"
     3 #include"stdlib.h"
     4 #include"algorithm"
     5 #include"queue"
     6 #include"math.h"
     7 #include"iostream"
     8 #include"vector"
     9 #define M 100009
    10 #define inf 0x3f3f3f3f
    11 #define eps 1e-9
    12 #define PI acos(-1.0)
    13 #include"map"
    14 #include"vector"
    15 #include"set"
    16 #include"string"
    17 using namespace std;
    18 int main()
    19 {
    20     int n,kk=1;
    21     while(scanf("%d",&n)!=-1)
    22     {
    23         set<int>sa,sb;
    24         sa.insert(-1);
    25         sb.insert(1000000001);
    26         deque<int>q;
    27         printf("Case #%d:
    ",kk++);
    28         while(n--)
    29         {
    30             char str[111];
    31             scanf("%s",str);
    32             if(strcmp(str,"in")==0)
    33             {
    34                 int k;
    35                 scanf("%d",&k);
    36                 q.push_back(k);
    37                 sa.insert(k);
    38                 int la=sa.size();
    39                 int lb=sb.size();
    40                 int u=*(sa.rbegin());
    41                 int v=*(sb.begin());
    42                 if(la>lb)
    43                 {
    44                     sa.erase(u);
    45                     sb.insert(u);
    46                 }
    47                 u=*(sa.rbegin());
    48                 v=*(sb.begin());
    49                 if(u>v)
    50                 {
    51                     sb.erase(v);
    52                     sa.insert(v);
    53                     sa.erase(u);
    54                     sb.insert(u);
    55                 }
    56             }
    57             else if(strcmp(str,"out")==0)
    58             {
    59 
    60                 int u=q.front();
    61                 q.pop_front();
    62                 sa.erase(u);
    63                 sb.erase(u);
    64 
    65                 int la=sa.size();
    66                 int lb=sb.size();
    67                 if(la+2==lb)
    68                 {
    69                     sa.insert(*(sb.begin()));
    70                     sb.erase(*(sb.begin()));
    71                 }
    72                 else if(la==lb+1)
    73                 {
    74                     sb.insert(*(sa.rbegin()));
    75                     sa.erase(*(sa.rbegin()));
    76                 }
    77             }
    78             else
    79             {
    80                 printf("%d
    ",*(sb.begin()));
    81             }
    82         }
    83     }
    84     return 0;
    85 }
    86 /*
    87 
    88 40
    89 in 11
    90 in 22
    91 in 33
    92 in 44
    93 in 55
    94 in 66
    95 query
    96 
    97 */
    View Code
  • 相关阅读:
    小米官网中,鼠标移动到某个卡片,会轻轻上浮
    微信小程序之表单验证rule
    小程序调用自定义组件里的方法(this.selectComponent(#id))
    Git —— GitLab生产ssh密钥
    WX获取地理位置列表接口示例
    for...of语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句(return break container可终止的循环)
    规格弹出框
    //将手机号中间4位数变成*
    //时间戳转换成日期时间(年月日)
    检查手机号是否正确
  • 原文地址:https://www.cnblogs.com/mypsq/p/4705741.html
Copyright © 2011-2022 走看看