zoukankan      html  css  js  c++  java
  • 1057. Stack (30)

    题目连接:https://www.patest.cn/contests/pat-a-practise/1057

    题意:在堆栈中增加一个返回中位数的功能。

    一开始我就直接将堆栈中的数移到vector中然后进行排序……

    网上看了很多人的答案,根本看不懂,树状数组好难理解啊,等以后再细细理解吧。

    参考了http://blog.csdn.net/kakitgogogo/article/details/51926600的解法,高明之处在于省去了将堆栈中元素移动的时间,利用set(默认由小到大排序),在Push的时候进行判断然后分别压入s1,s2(s2大于mid,s1小于等于mid);

    然后Pop和Push操作的时候分被调整s1,s2以及mid的值。保证s1的大小等于s2的大小或者等于s2的大小+1,这样,s1中的最后一个值就是mid;

    注意删除的时候要删除的对象是指针,否则将会把所有值相同的元素都删去

     1 #include<stdio.h>
     2 #include<set>
     3 #include<string.h>
     4 #include<stack>
     5 using namespace std;
     6 int mid=100005;
     7 multiset<int>s1,s2;
     8 
     9 void adjust()
    10 {
    11     multiset<int>::iterator it;
    12     if (s1.size()<s2.size())
    13     {
    14         it=s2.begin();
    15         s1.insert(*it);
    16         s2.erase(it);
    17     }
    18     if (s1.size()>s2.size()+1)
    19     {
    20         it=s1.end();
    21         it--;
    22         s2.insert(*it);
    23         s1.erase(it);
    24     }
    25     if (!s1.empty())
    26     {
    27         it=s1.end();
    28         it--;
    29         mid=*it;
    30     }
    31 }
    32 
    33 int main()
    34 {
    35     int N;
    36     scanf("%d",&N);
    37     char s[15];
    38     stack<int>st;
    39     int tmp,v;
    40     while (N--)
    41     {
    42         scanf("%s",s);
    43         if (strcmp(s,"Pop")==0)
    44         {
    45             if (st.size()==0)printf("Invalid
    ");
    46             else{
    47                 tmp=st.top();
    48             printf("%d
    ",tmp);
    49             st.pop();
    50             if (tmp<=mid)s1.erase(s1.find(tmp));
    51             else s2.erase(s2.find(tmp));
    52             adjust();
    53                 }
    54         }
    55         else if (strcmp(s,"PeekMedian")==0)
    56         {
    57            if (st.size()==0)printf("Invalid
    ");
    58            else
    59            {
    60                printf("%d
    ",mid);
    61                //adjust();
    62            }
    63         }
    64         else if (strcmp(s,"Push")==0)
    65         {
    66             scanf("%d",&v);
    67             st.push(v);
    68             if (v<=mid)s1.insert(v);
    69             else s2.insert(v);
    70             adjust();
    71         }
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    Access操作必须使用一个可更新的查询
    SAP资料学习好地方
    Access关键词大全
    WPF零散笔记
    WPF:如何实现单实例的应用程序(Single Instance)
    WPF应用程序启动显示图片资源
    Drawable、Bitmap、Canvas和Paint的关系以及部分使用方法
    C#中一种可调用的异常处理方法
    easyui datagrid 点击列表头排序出现错乱的原因
    easyui datagrid 没数据时显示滚动条的解决方法
  • 原文地址:https://www.cnblogs.com/wuxiaotianC/p/6434394.html
Copyright © 2011-2022 走看看