zoukankan      html  css  js  c++  java
  • b_pat_栈(2*multiset+stack)

    现在,你需要实现一个栈,该栈要具有一个额外的操作:PeekMedian-返回栈中所有元素的中值。
    对于 N 个元素,如果 N 为偶数,则中值定义从小到大第 N/2 个元素;如果 N 为奇数,则中值定义为从小到大第 (N+1)/2 个元素(N≤1e5)

    方法一:2*multiset+stack模拟

    用minS存≤mid的数,maxS存>mid的数,分为两个情况:

    #include<bits/stdc++.h>
    using namespace std;
    multiset<int> minS, maxS;   //minS存小于等于mid的数;maxS存大于mid的数
    int mid;
    void update() {
        if (minS.size()>maxS.size()+1) {
            auto it=minS.end();
            minS.erase(--it), maxS.insert(*it);
        }if (minS.size()<maxS.size()) {
            auto it=maxS.begin();
            minS.insert(*it), maxS.erase(it);
        }if (!minS.empty()) {
            auto it=minS.end(); 
            mid=*(--it);
        }
    }
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        int n; cin>>n;
        string a,b;
        stack<int> st;
      
        for (int i=0; i<n; i++) {
            cin>>a;
            if (a=="Push") {
                cin>>b;
                int v=stoi(b); st.push(v);
                if (v<=mid) minS.insert(v);
                else        maxS.insert(v);
                update();
            } else if (a=="Pop") {
                if (st.empty()) printf("Invalid\n");
                else {
                    int v=st.top(); st.pop();
                    if (v<=mid) minS.erase(minS.find(v));
                    else        maxS.erase(maxS.find(v));
                    update();
                    printf("%d\n", v);
                }
            } else {
                if (st.empty()) printf("Invalid\n");
                else printf("%d\n", mid);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    VS无法打开类视图
    C#中的Boolean类型
    Some websites to learn Ubuntun
    HOW TO : Install Eclipse with C/C++ in Ubuntu 12.04
    [转载]Android开发之旅:环境搭建及HelloWorld
    C#学习笔记—了解C#
    C#继承机制
    使用U盘安装Ubuntu
    [Z]ubuntu12.04搭建android开发环境
    Windows程序的调用方法
  • 原文地址:https://www.cnblogs.com/wdt1/p/13657813.html
Copyright © 2011-2022 走看看