【PAT】【Advanced Level】1057. Stack (30)

2024-06-17 04:18
文章标签 stack level 30 pat advanced 1057

本文主要是介绍【PAT】【Advanced Level】1057. Stack (30),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1057. Stack (30)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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.

Input Specification:

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.

Output Specification:

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.

Sample Input:
17
Pop
PeekMedian
Push 3
PeekMedian
Push 2
PeekMedian
Push 1
PeekMedian
Pop
Pop
Push 5
Push 4
PeekMedian
Pop
Pop
Pop
Pop
Sample Output:
Invalid
Invalid
3
2
2
1
2
4
4
5
3
Invalid
原题链接:

https://www.patest.cn/contests/pat-a-practise/1057

思路:

两个set,分别存放上下一半

开数组记录重复的元素(也可以用multiset)

插入时,先插入元素较少的set,然后调整,使得第一个的最大值不大于第二个的最小值。

删除时,先找,再删,然后调整两个set的大小为一样或者差一个。

查询时,若为奇数个,取大的begin()

否则取小的end()

坑:

用scanf、printf读写,否则超时

CODE:

#include<iostream>
#include<cstring>
#include<string>
#include<set>
#include<cstdio>
#include<stack>
#define N 100100
using namespace std;
stack<int> st;
set<int> s1;
int n1[N];
int size1;
set<int> s2;
int n2[N];
int size2;
int main()
{memset(n1,0,sizeof(n1));memset(n2,0,sizeof(n2));int n;cin>>n;int to=-1;size1=0;size2=0;for (int i=0;i<n;i++){char t[10];scanf("%s",t);if (t[1]=='o'){if (st.empty()){printf("Invalid\n");}else{int _top=st.top();st.pop();printf("%d\n",_top);if (n1[_top]!=0){n1[_top]--;size1--;if (n1[_top]==0)	s1.erase(s1.find(_top));while (size1<size2-1){int b=*s2.begin();if (n2[b]==1) s2.erase(s2.find(b));n2[b]--;size2--;if (n1[b]==0) s1.insert(b);n1[b]++;size1++;}}else{n2[_top]--;size2--;if (n2[_top]==0)	s2.erase(s2.find(_top));while (size2<size1){int a=*s1.rbegin();if (n1[a]==1) s1.erase(s1.find(a));n1[a]--;size1--;if (n2[a]==0) s2.insert(a);n2[a]++;size2++;}}}}else if (t[1]=='u'){scanf("%d",&to);st.push(to);if (size1 < size2){size1++;if (n1[to]==0)	s1.insert(to);n1[to]++;			}else{size2++;if (n2[to]==0)	s2.insert(to);n2[to]++;}if (s1.empty()) continue;while (*s1.rbegin()>*s2.begin()){int a=*s1.rbegin();int b=*s2.begin();if (n1[a]==1)	s1.erase(s1.find(a));n1[a]--;if (n2[b]==1)	s2.erase(s2.find(b));n2[b]--;if (n1[b]==0)	s1.insert(b);n1[b]++;if (n2[a]==0)	s2.insert(a);n2[a]++;}	}else {if (st.empty()){printf("Invalid\n");}else{if (size1<size2){int a=*s2.begin();printf("%d\n",a);}else{int a=*s1.rbegin();printf("%d\n",a);}}}}	return 0;
}






这篇关于【PAT】【Advanced Level】1057. Stack (30)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068459

相关文章

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

c++习题30-求10000以内N的阶乘

目录 一,题目  二,思路 三,代码    一,题目  描述 求10000以内n的阶乘。 输入描述 只有一行输入,整数n(0≤n≤10000)。 输出描述 一行,即n!的值。 用例输入 1  4 用例输出 1  24   二,思路 n    n!           0    1 1    1*1=1 2    1*2=2 3    2*3=6 4

Java-数据结构-栈和队列-Stack和Queue (o゚▽゚)o

文本目录: ❄️一、栈(Stack):     ▶ 1、栈的概念:   ▶ 2、栈的使用和自实现:      ☑ 1)、Stack():       ☑ 2)、push(E e):      ☑ 3)、empty():         ☑ 4)、peek(E e):        ☑ 5)、pop(E e):       ☑ 6)、size(E e):  ▶ 3、栈自实现的总代

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本

MiniCPM-V: A GPT-4V Level MLLM on Your Phone

MiniCPM-V: A GPT-4V Level MLLM on Your Phone 研究背景和动机 现有的MLLM通常需要大量的参数和计算资源,限制了其在实际应用中的范围。大部分MLLM需要部署在高性能云服务器上,这种高成本和高能耗的特点,阻碍了其在移动设备、离线和隐私保护场景中的应用。 文章主要贡献: 提出了MiniCPM-V系列模型,能在移动端设备上部署的MLLM。 性能优越:

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)「首先来看看目前已有的资料,还会不断更新哦~一次购买,后续不会再被收费哦,保证是全网最全资源,随着后续内容更新,价格会上涨,越早购买,价格越低,让大家再也不需要到处买断片资料啦~💰💸👋」�

JobScheduler 调用导致的运行时长30分钟的功耗问题

一、SDK 的使用情况与功耗影响 案例是否导致功耗变大onStartJob return true 且子线程没有调用jobFinished()告知系统功耗变大,最长带来30分钟的partial wakelock 长持锁onStartJob return true 且子线程调用jobFinished()告知系统功耗有影响,主要线程执行时长,标准是30秒内onStartJob return fals

嵌入式面试经典30问:一

什么是嵌入式系统? 嵌入式系统是指嵌入到某个对象体系中的专用计算机系统,它负责执行特定的任务,具有专用性、隐蔽性、资源受限和可靠性要求高等特点。通常包括硬件和软件两部分,硬件以微处理器为核心,软件则负责控制和管理硬件资源,实现特定的应用功能。 嵌入式系统和普通计算机系统有什么区别? 嵌入式系统与普通计算机系统的主要区别在于目的、资源、性能和成本等方面。嵌入式系统通常针对特定应用设计,具有体积小