P1168 中位数
hhhhhhhh神奇传送门
呐呐呐,看到题目第一眼想到的当然是暴力模拟了,但是O(n*n)的时间复杂度确实受不了
那我们该想到啥捏??
对了,二叉堆!!!虽然我也不知道为什么嘤嘤嘤
好嘛,既然想到了二叉堆,就得想想如何去实现了
中位数的话呢,就是这个数在序列中前后数字个数相同(因为个数是奇数),那么构建两个堆,一个大根堆,用于装比中位数小的,另一个小根堆用于装比中位数大的是不是很简单啊
好的上代码::
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<queue> 5 #include<cstring> 6 #include<iostream> 7 using namespace std; 8 9 int n,zy; 10 priority_queue < int > z; 11 priority_queue < int,vector<int>,greater<int> > y; 12 13 int abs(int a){//手写abs会快一点?? 14 return a<0?-a:a; 15 } 16 17 int main(){ 18 scanf("%d%d",&n,&zy); 19 z.push(zy); 20 printf("%d\n",z.top()); 21 for (int i=2;i<=n;i++){ 22 scanf("%d",&zy); 23 if (zy>z.top()){ 24 y.push(zy); 25 } 26 else{ 27 z.push(zy); 28 } 29 int l=z.size()-y.size();//l用于表示两个堆中个数相差之数,若大于1,则说明不平均,进行以下判断,调换堆中元素 30 while(abs(l)>1){ 31 if (z.size()>y.size()){ 32 y.push(z.top()); 33 z.pop(); 34 } 35 else{ 36 z.push(y.top()); 37 y.pop(); 38 } 39 l=z.size()-y.size(); 40 } 41 if (i%2){ 42 printf("%d\n",z.size()>y.size()?z.top():y.top()); 43 } 44 } 45 return 0; 46 }
好的好的,那多的就没什么好说的了 祝大家身体健康,万事如意 我为什么要废这个话??
但是,我还是得废一句话:新人开博鼓励一下吧。。。