您的位置:首页 > 其它

UVA 10954 Add All

2016-10-20 20:49 267 查看

UVA 10954 Add All

题目大意:

给一串数字,每次可以从中去掉俩个数然后将他们的和放入。每次操作的开销为去掉的俩个数之和。求出最小的总开销

解题思路:

快速排序后去掉最小俩个数,然后将俩数之和放入后再次快速排序然后去掉俩个数……以此类推

#include <cstdio>
#include <cstring>
#include <stack>
#include <iostream>
#include <algorithm>
using namespace std;
long long int count(int m, long long int *num) {
long long int p = 0;
for(int i = 1; i < m; i++) {
p = p + num[i-1] + num[i];
num[i] = num[i-1] + num[i];
sort(num+i, num+m);
}
return p;
}
int main() {
int m;
long long int num[5010];
while(cin >> m && m != 0) {
for(int i = 0; i < m; i++)
cin >> num[i];
sort(num, num+m);
int res = count(m, num);
cout << res << endl;
}
return 0;
}


或者用优先队列

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;

priority_queue<long long int, vector<int>, greater<long long int> > que;
int main() {
int n;
long long int x;
long long int re;
while(cin >> n && n) {
for(int i = 0; i <n; i++) {
long long int a;
cin >> a;
que.push(a);
}
re = 0;
while(1) {
x = que.top();
que.pop();
if(que.empty()) {
break;
}
x = x + que.top();
que.pop();
que.push(x);
re = re + x;
}
cout << re << endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva 快速排序