1057 Stack
题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805417945710592
题目描述比较简单,在栈的操作基础上新增一个取中值的操作
思路也很直接,直接用栈进行模拟,果然,时间爆掉了,代码如下:
#include<iostream>
#include<stack>
#include<stdio.h>
#include<algorithm>
//#include<>
using namespace std;
int main(){
stack<int> st1;
stack<int> st2;
int n;
scanf("%d",&n);
char ch[11];
int stem;
for(int i = 0; i < n; i++){
scanf("%s",ch);
if((ch[1] == 'o' && st1.size() == 0) || (ch[1] == 'e' && st1.size() == 0)){ //非法情况
printf("Invalid\n");
continue;
}
else if(ch[1] == 'u'){ //push操作
scanf("%d",&stem);
st1.push(stem);
}
else if(ch[1] == 'o'){ //pop操作
printf("%d\n",st1.top());
st1.pop();
}
else if(ch[1] == 'e'){ //新增操作
int count = 0;
int shuzu[st1.size()];
while(!st1.empty()){ //取出数据进行排序,输出中值
st2.push(st1.top());
shuzu[count++] = st1.top();
st1.pop();
}
sort(shuzu,shuzu+count);
printf("%d\n",shuzu[(count-1)/2]);
while(!st2.empty()){
st1.push(st2.top());
st2.pop();
}
}
}
return 0;
}
想想也是,每次的操作都会进行排序,时间肯定会超时。
参考网上大佬们的解题,看到一个比较有趣而且很简单的操作,使用多重集进行中值的维护,需要的时候直接输出中值就可以了,代码如下:
#include<iostream>
#include<stack>
#include<stdio.h>
//#include<functional>
#include<set>
#include<algorithm>
using namespace std;
int mid = 0; //中值
multiset<int> upper; //大于中位数的从小到大排序
multiset<int,greater<int>>lower; //小于中位数的从大到小排序
void adjust(int *mid){ //调整中位数
if(upper.size() > lower.size()){
lower.insert(*upper.begin());
upper.erase(upper.begin());
}
else if(lower.size() > upper.size()+1){
upper.insert(*lower.begin());
lower.erase(lower.begin());
}
*mid = *lower.begin();
}
int main(){
stack<int> st1;
//stack<int> st2;
int n;
scanf("%d",&n);
char ch[11];
int stem;
for(int i = 0; i < n; i++){
scanf("%s",ch);
if((ch[1] == 'o' && st1.size() == 0) || (ch[1] == 'e' && st1.size() == 0)){ //非法情况
printf("Invalid\n");
continue;
}
else if(ch[1] == 'u'){ //push操作
scanf("%d",&stem);
st1.push(stem);
if(stem > mid){
upper.insert(stem);
}
else lower.insert(stem);
adjust(&mid);
}
else if(ch[1] == 'o'){ //pop操作
int key = st1.top();
printf("%d\n",st1.top());
st1.pop();
if(key > *lower.begin())
upper.erase(upper.find(key));
else lower.erase(lower.find(key));
if(st1.empty()) mid = 0;
else adjust(&mid);
}
else if(ch[1] == 'e'){ //新增操作
printf("%d\n",mid);
/*int count = 0;
int shuzu[st1.size()];
while(!st1.empty()){ //取出数据进行排序,输出中值
st2.push(st1.top());
shuzu[count++] = st1.top();
st1.pop();
}
sort(shuzu,shuzu+count);
printf("%d\n",shuzu[(count-1)/2]);
while(!st2.empty()){
st1.push(st2.top());
st2.pop();
}*/
}
}
return 0;
}