您的位置:首页 > 产品设计 > UI/UE

uestc data structure training f 秋实大哥与妹纸

2015-04-17 16:12 323 查看
内存限制是1500k,开始我用的分治法,O(n)的空间复杂度,O(nlgn)的时间复杂度,结果怎么都超时,看来还是要减小空间复杂度,后经胡巨巨提醒,发现了更好的解法.先用前一半的数据建立一个大根堆,再处理剩下的一半:如果比s[0]大,直接舍去,如果比s[0]小,直接替换掉s[0],再维护堆性质,这样到最后,堆顶的元素刚好是中位数。时间复杂度不变,空间复杂度一下子降到原来的一半,实在是太牛逼的算法了!

对基本数据结构的理解还是需要不断的强化

#include<cstdio>
#include<algorithm>
#define MAX 125010
using namespace std;

int i,n,s[MAX],help;

void heapify(int root){
if(root>n/4)
return ;
if(s[root]>=s[root*2+1]&&s[root]>=s[root*2+2])
return ;
if(s[root*2+1]>s[root*2+2]){
swap(s[root],s[root*2+1]);
heapify(root*2+1);
}
else{
swap(s[root],s[root*2+2]);
heapify(root*2+2);
}
}

void heap(){
for(i=n/4;i>=0;i--){
heapify(i);
}
}

int main(){
scanf("%d",&n);
for(i=0;i<=n/2;i++)
scanf("%d",&s[i]);
heap();
for(i=n/2+1;i<n;i++){
scanf("%d",&help);
if(help<s[0]){
s[0]=help;
heapify(0);
}
}
if(n%2==1)
printf("%.1lf\n",(double)s[0]);
else
printf("%.1lf\n",((double(s[0])+(double)max(s[1],s[2]))/2));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐