/*
题意: 有一些随时更新的数据,求排序后的中间点. 当总数量是偶数时,则不存在中间点
思路: 可以把数据分成两半,使用两个堆,最大堆和最小堆,一半比中间值小,一半比中间值大,
插入数据时,只需要和前一半(最大堆)的最大值和后一半(最小堆)的最小值比较即可
必须保证第1个堆(大顶堆)的堆顶结点要小于第2个堆(小顶堆)的堆顶结点,这样小顶堆的结点就全部大于大顶堆的结点,
且小顶堆的结点数只能与大顶堆的结点数相等或者比它大 1
这样任何时候,如果两堆大小相等,则说明总数量是偶数,不存在中间结点
如果小顶堆的结点数比大顶堆大 1,则中间结点就是小顶堆的堆顶结点
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 100010
struct node
{
char ch[12];
int num;
const node operator=(const node& other)
{
num=other.num;
strcpy(ch,other.ch);
return *this;
}
}A[maxn],B[maxn]; // A , B 分别是大顶堆和小顶堆, 它们的堆顶点一直是 A[0] , B[0]
bool myless(const node& a,const node& b) //大顶堆比较函数
{
return a.num < b.num;
}
bool mygreater(const node& a,const node& b) //小顶堆比较函数
{
return a.num > b.num;
}
int Alen,Blen; // Alen ,Blen 分别是大顶堆和小顶堆的规模
void insert(int num,char ch[],int tag) // 进堆
{
if(tag==0) // 压入大顶堆
{
A[Alen].num=num;
strcpy(A[Alen].ch,ch);
Alen++;
push_heap(A,A+Alen,myless);
}
else // 压入小顶堆
{
B[Blen].num=num;
strcpy(B[Blen].ch,ch);
Blen++;
push_heap(B,B+Blen,mygreater);
}
}
void remove(int tag) // 出堆
{
if(tag==0) // 弹出大顶堆
{
pop_heap(A,A+Alen,myless);
Alen--;
}
else // 弹出小顶堆
{
pop_heap(B,B+Blen,mygreater);
Blen--;
}
}
int main()
{
int cases;
cin>>cases;
while(cases--)
{
Alen=Blen=0;
int num;
char str[12],ch[12];
while(scanf("%s",str))
{
if(strcmp(str,"Add")==0)
{
scanf("%s%d",ch,&num);
if(Alen==Blen) // 若两个堆结点数相等,则将新结点压入小顶堆
{
if(Blen==0)
insert(num,ch,1);
else //比较新结点与大顶堆的堆顶点的大小
{
if(num>A[0].num) //新结点大于大顶堆的堆顶点,则直接压入小顶堆
insert(num,ch,1);
else
{
insert(A[0].num,A[0].ch,1);
remove(0);
insert(num,ch,0);
//新结点小于大顶堆的堆顶点,则先要把大顶堆的堆顶点压入小顶堆,
//再弹出大顶堆的堆顶点,最后把新结点压入大顶堆,
//保证大顶堆的所有结点全部小于小顶堆的结点
}
}
}
else //两个堆的结点数不相等,即大顶堆结点数较少,则将新结点压入大顶堆
{
if(num<B[0].num) //新结点小于小顶堆的堆顶点,则直接压入大顶堆
insert(num,ch,0);
else
{
insert(B[0].num,B[0].ch,0);
remove(1);
insert(num,ch,1);
//新结点大于小顶堆的堆顶点,则先要把小顶堆的堆顶点压入大顶堆,
//再弹出小数点顶堆的堆顶点,最后把新结点压入小顶堆
}
}
}
else if(strcmp(str,"Query")==0)
{
if (Alen==Blen) // 总数量是偶数,不存在中间结点
printf("No one!\n");
else
printf("%s\n",B[0].ch);
}
else if(strcmp(str,"End")==0)
{
if (Alen==Blen)
printf("Happy BG meeting!!\n");
else
printf("%s is so poor.\n",B[0].ch);
break;
}
}
if(cases>0)
printf("\n");
}
return 0;
}
sicily 1022. Poor contestant Prob
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
1022. Sum of Root To Leaf Binary Numbers*
1022. Sum of Root To Leaf Binary Numbers*
leetcode 算法 c++ 子节点 前序遍历 -
LeetCode 1022. 从根到叶的二进制数之和
截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载下载链
leetcode 数据结构 算法 从根到叶的二进制数之和 子节点