现在的位置: 首页 > 综合 > 正文

(贪心5.2.2)UVA 10954 Add All(利用数据的有序化来进行贪心选择)

2013年10月30日 ⁄ 综合 ⁄ 共 546字 ⁄ 字号 评论关闭

本题实际上求的是n-1个数和的总和的

/*
 * UVA_10954.cpp
 *
 *  Created on: 2013年10月10日
 *      Author: Administrator
 */



#include <iostream>
#include <cstdio>

using namespace std;

const int maxn = 5010;
int n;
int a[maxn];
void sift(int i){
	a[0] = a[i];
	int k = i << 1;
	while(k <= n){
		if(k < n && a[k] > a[k+1]){
			k++;
		}

		if(a[0] > a[k]){
			a[i] = a[k];
			i = k;
			k = i << 1;
		}else{
			k = n + 1;
		}
	}

	a[i] = a[0];
}

void work(){
	int i;
	for(i = n >> 1 ; i ; i--){
		sift(i);
	}
	long long ans = 0;
	while(n!=1){
		swap(a[1],a[n--]);
		sift(1);
		a[1] += a[n+1];
		ans += a[1];
		sift(1);
	}

	printf("%lld\n",ans);
}
int main(){
	while(scanf("%d",&n)!=EOF,n){
		int i;
		for(i = 1 ; i <= n ; ++i){
			scanf("%d",&a[i]);
		}

		work();
	}

	return 0;
}

抱歉!评论已关闭.