uva 10954(贪心)

来源:互联网 发布:mysql安装包下载 64位 编辑:程序博客网 时间:2024/04/28 20:36

题意:一些数字两两相加,要求把每次两数相加的和全部加起来最小。

题解:优先队列会更好写,幸好数据量不是很大,所以数组代替,每次都挑数字中最小的两个相加,然后把和再放到数组里面,注意把和加入时保持数组的升序,然后每次的和都加起来得到结果。

#include <stdio.h>#include <string.h>#include <algorithm>#define ll long longusing namespace std;const int N = 20000;int main() {long long sum, n, num[N], ans, front, rear, i, j;while (scanf("%lld", &n) && n) {for (i = 0; i < n; i++)scanf("%lld", &num[i]);sort(num, num + n);ans = 0;front = 0;rear = n;while (front + 2 <= rear) {sum = num[front] + num[front + 1];for (i = front + 2; i < rear; i++)if (num[i] > sum)break;for (j = rear - 1; j >= i; j--)num[j + 1] = num[j];num[i] = sum;front += 2;rear++;ans += sum;}printf("%lld\n", ans);}return 0;}


0 0
原创粉丝点击