您的位置:首页 > 其它

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

2013-10-10 19:03 363 查看
本题实际上求的是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: