CodeVS 1063 合并果子 题解

#include 
#include 
using namespace std;

int a[10000+2];
int N, ans;

void Heap_adjust(int s, int e){
	a[0] = a[s];
	for(int i = s+s; i<=e; i += i){
		if(i=a[0]) break;
		a[s] = a[i];
		s = i;
	}
	a[s] = a[0];
}

int main() {
	scanf("%d", &N);
	for(int i = 1; i<=N; ++i) scanf("%d", a+i);
	for(int i = N/2; i; --i) Heap_adjust(i, N);
	for(int i = N; i>1; --i){
		swap(a[1], a[i]);
		Heap_adjust(1, i-1);
		ans += a[1]+= a[i];
		Heap_adjust(1, i-1);
	}
	printf("%d\n", ans);
	return 0;
}

你可能感兴趣的:(堆)