Stack (30)(模拟栈,输出中间数用set)
Stack is one of the most fundamental data structures, which is based on the principle of Last In First Out (LIFO). The basic operations include Push (inserting an element onto the top position) and Pop (deleting the top element). Now you are supposed to implement a stack with an extra operation: PeekMedian -- return the median value of all the elements in the stack. With N elements, the median value is defined to be the (N/2)-th smallest element if N is even, or ((N+1)/2)-th if N is odd.
输入描述:
Each input file contains one test case. For each case, the first line contains a positive integer N (<= 105). Then N lines follow, each contains a command in one of the following 3 formats:
Push key
Pop
PeekMedian
where key is a positive integer no more than 105.
输出描述:
For each Push command, insert key into the stack and output nothing. For each Pop or PeekMedian command, print in a line the corresponding returned value. If the command is invalid, print "Invalid" instead.
输入例子:
17
Pop
PeekMedian
Push 3
PeekMedian
Push 2
PeekMedian
Push 1
PeekMedian
Pop
Pop
Push 5
Push 4
PeekMedian
Pop
Pop
Pop
Pop
输出例子:
Invalid
Invalid
3
2
2
1
2
4
4
5
3
Invalid
题解:一开始我的想法是用vector来模拟栈,排完序后输出中间的值,但是似乎vector的效率并不高
故超时,感觉思路没什么错误。。。
第一次超时代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<vector>
using namespace std;
int main()
{
stack<int>s;
vector<int>v;
vector<int>::iterator it;
string str;
int n;
int k;
cin>>n;
for(int t=0;t<n;t++)
{
cin>>str;
if(str=="Pop")
{
if(!s.empty())
{
printf("%d\n",s.top());
it=v.begin()+s.size()-1;
v.erase(it);
s.pop();
}
else
{
printf("Invalid\n");
}
}
else if(str=="PeekMedian")
{
sort(v.begin(), v.end(),less<int>());
if(!s.empty())
{
if(s.size()%2==1)
{
it=v.begin()+(s.size()+1)/2-1;
printf("%d\n",*it);
}
else
{
it=v.begin()+s.size()/2-1;
printf("%d\n",*it);
}
}
else
{
printf("Invalid\n");
}
}
else
{
scanf("%d",&k);
s.push(k);
v.push_back(k);
}
}
return 0;
}
换用set的排序功能可以降低复杂度
AC代码:
#include <iostream>
#include <vector>
#include <set>
#include <stack>
#include <cstring>
using namespace std;
stack<int> stk;
multiset<int> set1,set2;
int mid;
//set1存mid及以下的数,其大小应该与set2相等,或多1
void adjust(){
if(set1.size()<set2.size()){//将set2最小的移到set1
auto it=set2.begin();
set1.insert(*it);
set2.erase(it);
}else if(set1.size()>set2.size()+1){//将set1最大的移到set2
auto it=set1.end();
it--;
set2.insert(*it);
set1.erase(it);
}
//重新计算mid
if(!stk.empty()){
auto it=set1.end();
it--;
mid=*it;
}
}
int main(){
int N;
scanf("%d",&N);
char ch[12];
int top,x;
while(N--){
scanf("%s",ch);
if(strcmp(ch,"Pop")==0){
if(stk.empty())
printf("Invalid\n");
else{
top=stk.top();
stk.pop();
printf("%d\n",top);
if(top<=mid)
set1.erase(set1.find(top));
else
set2.erase(set2.find(top));
adjust();
}
}else if(strcmp(ch,"PeekMedian")==0){
if(stk.empty())
printf("Invalid\n");
else
printf("%d\n",mid);
}else if(strcmp(ch,"Push")==0){
scanf("%d",&x);
stk.push(x);
if(stk.empty()){
set1.insert(x);
mid=x;
}else if(x<=mid)
set1.insert(x);
else
set2.insert(x);
adjust();
}else
printf("Invalid\n");
}
return 0;
}
Stack (30)(模拟栈,输出中间数用set)的更多相关文章
- c语言学习,模拟栈操作
1.stack.c模拟栈操作函数的实现 #include<stdio.h> #include<stdlib.h> ; static char *stack;//数据栈 ;//栈 ...
- java模拟栈的操作
栈是一种有序列表,可以使用数组的结构来储存栈的数据内容 思路 1. 创建一个栈类StackArray 2. 定义一个top来模拟栈顶,初始化为-1 3. 入栈: 当有数据加入到栈的时候 top++ s ...
- ACM/ICPC 之 用双向链表 or 模拟栈 解“栈混洗”问题-火车调度(TSH OJ - Train)
本篇用双向链表和模拟栈混洗过程两种解答方式具体解答“栈混洗”的应用问题 有关栈混洗的定义和解释在此篇:手记-栈与队列相关 列车调度(Train) 描述 某列车调度站的铁道联接结构如Figure 1所示 ...
- 第一回写的用arraylist模拟栈操作
package hashMap; import java.util.ArrayList; import d.Student; /** * 用ArrayList模拟栈操作 * @author zhuji ...
- HDOJ/HDU 1022 Train Problem I(模拟栈)
Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot o ...
- 使用golang的slice来模拟栈
slice(切片):底层数据结构是数组 stack(栈):一种先进后出的数据结构 普通版的模拟写入和读取的栈 package main import "fmt" //栈的特点是先进 ...
- 【PAT甲级】1057 Stack (30 分)(分块)
题意: 输入一个正整数N(<=1e5),接着输入N行字符串,模拟栈的操作,非入栈操作时输出中位数.(总数为偶数时输入偏小的) trick: 分块操作节约时间 AAAAAccepted code: ...
- java 16 - 5 LinkedList模拟栈数据结构的集合
请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...
- 【DataStructure In Python】Python模拟栈和队列
用Python模拟栈和队列主要是利用List,当然也可以使用collection的deque.以下内容为栈: #! /usr/bin/env python # DataStructure Stack ...
随机推荐
- Python多线程-ThreadLocal
参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017630786314240#0 ThreadLocal ThreadLocal变量虽然是 ...
- iOS开发多线程在实际项目中的运用
实际项目开发中为了能够给用户更好的体验,有些延时操作我们都会放在子线程中进行. 今天我们就来聊聊多线程在实际项目中的运用. 我们先来看看多线程的基础知识: 1.多线程的原理: 同一时间,CPU只能处理 ...
- Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
- 自动发布-asp.net自动发布、IIS站点自动发布(集成SLB、配置管理、Jenkins)
PS:概要.背景.结语都是日常“装X”,可以跳过直接看自动发布 环境:阿里云SLB.阿里云ECS.IIS7.0.Jenkins.Spring.Net 概要 公司一个项目从无到有,不仅仅是系统从无到有的 ...
- centos之hadoop的安装
Evernote Export 第一步 环境部署 参考 http://dblab.xmu.edu.cn/blog/install-hadoop-in-centos/ 1.创建hadoop用户 $su ...
- Qt之先用了再说系列-定时器的用法
Qt 定时器是一个比好用的东西,在此就地简单记录一下使用的方式: 1.首先包含头文件 #include <QTimer> 2.具体用法有几种,我就写其中2种吧 1>执行一次 这种方式 ...
- 【高阶版】Python词典
使用dict.fromkeys()创建词典的一个坑 创建词典有三种方法,第一是直接赋值,d = {1:2, 2:3}:第二个是,通过构造方法,d = dict([(1, 2), (2, 3)]),第三 ...
- Linux内核之 进程调度
上一篇我们提到过进程状态,而进程调度主要是针对TASK_RUNNING运行状态进行调度,因为其他状态是不可执行比如睡眠,不需要调度. 1.进程调度概念 进程调度程序,简称调度程序,它是确保进程能有效工 ...
- 【SCOI2013】摩托车交易 - 最大生成树+树链剖分
题目描述 mzry1992 在打完吊针出院之后,买了辆新摩托车,开始了在周边城市的黄金运送生意.在mzry1992 生活的地方,城市之间是用双向高速公路连接的.另外,每条高速公路有一个载重上限,即在不 ...
- Mapreduce学习(一)
MapReduce 介绍 简单介绍: MapReduce思想在生活中处处可见.或多或少都曾接触过这种思想.MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景) ...