0分,用的堆,求调
查看原帖
0分,用的堆,求调
490978
小超手123楼主2022/2/19 14:30
#include<bits/stdc++.h>
#define maxn 10010
using namespace std;
int n,len,num,a[maxn],ans,x,y; //小根堆 
void put(int x){ //插入一个x 
	a[++len]=x;
	int son=len,father;
	while(son>1){
		father=son/2;
		if(a[father]<=a[son])break;
		else swap(a[father],a[son]);
		son=father;
	}
}
int get(){ //删除根节点 
    int res=a[1];
	a[1]=a[n];
	len--;
	int son=1,father=1;
	while(father*2<=len){ 
	    son*=2;
		if(son<len&&a[son+1]<a[son])son++;
		if(a[father]<=a[son])break;
		else swap(a[father],a[son]);
		father=son;
	}
	return res;
}
int main() {
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>num;
		put(num);
	}
	for(int i=1;i<=len;i++)cout<<a[i]<<" ";
	cout<<endl;
	for(int i=1;i<=n-1;i++){
	    x=get();
		y=get();
		ans+=x+y;
	}
	cout<<ans;
    return 0;
}



2022/2/19 14:30
加载中...