10分求调,非常感谢
查看原帖
10分求调,非常感谢
1100140
Ryoo楼主2024/12/1 12:01
//取堆中次小值时没考虑len==2的情况,已修正
#include <bits/stdc++.h>
using namespace std;
int a[10005],len,n;
void extract() {
	int p = 1;
	a[1] = a[n];len--;
	int s = p*2;
	while(s <= n) {
		if(a[s] > a[s+1] && s < n) s++;
		if(a[s] < a[p]) {
			swap(a[s],a[p]);
			p = s;s *= 2;
		}
		else break;
		
	}
	
}
void insert(int val) {
	a[++len] = val;
	int s = len/2,p = len;
	while(s >= 1) {
		if(a[s] > a[p]) {
			swap(a[s],a[p]);
			p = s;s = p/2;
		}
		else break;
	}
}
int main() {

	scanf("%d", &n);
	len = n;
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	sort(a+1,a+1+n);
	int ans = 0;
	for(int i = 1; i <= n-1; i++) {
		int tmp2 = len>=3?min(a[2],a[3]):a[2];
		ans+=(a[1]+tmp2);

		int tmp = (a[1]+tmp2);
		extract();extract();
		insert(tmp);
	}
	printf("%d",ans);
	return 0;
	
}
2024/12/1 12:01
加载中...