UVa10954

Add All

题意:最优二叉树(priority_queue实现)

#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;

int main(int argc, char *argv[])
{
    int n, i, j, a, sum[6000];
    priority_queue <int> A;
    while(scanf("%d", &n) != EOF && n)
    {
        for(i = 1; i <= n; i++)
        {
            scanf("%d", &a);
            a = -a;
            A.push(a);
        }
        memset(sum, 0, sizeof(sum));
        i = 1;
        for(j = 1; j <= n - 1; j++)
        {
            sum[i] += A.top();
            A.pop();
            sum[i] += A.top();
            A.pop();
            A.push(sum[i]);
            i++;
        }
        i--;
        int max = 0;
        for(int j = 1; j <= i; j++)
            max += sum[j];
        printf("%d\n", -max);
        A.pop();
    }
    return 0;
}

UVa10954,布布扣,bubuko.com

时间: 2024-10-13 04:13:54

UVa10954的相关文章

uva10954 - Add All(multiset函数)

题目:10954 - Add All 题目大意:求n个数的和,但是有点不一样的是题目要求计算最少花费.每次两个数相加,得到的那个数就是每次计算的cost. 解题思路:之前没有想到用multiset,自己写好麻烦.要求cost 最小的话,说明每次都将这些数里面最小的两个做相加,这样每次花费都是最小的.用multiset,就可以将每次计算的结果插入这些已经有序的数据中相应的位置,使得这个序列依旧有序. 代码: #include <stdio.h> #include <set> usin

UVa10954 Add All (Huffman编码,优先队列)

链接:http://vjudge.net/problem/UVA-10954 分析:Huffman编码建立过程,每次贪心选取两个当前最小数,从集合中删去,然后把它们的和放回集合,用优先队列去模拟集合而且可以优化取最小数过程. 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 using namespace std; 5 6 const int maxm = 500 + 5; 7 8 int

UVA-10954 Add All

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1895 题目大意:类似于这道题UESTC - 1599 就是将所有的数字最后合并为一个数字,但是每次合并需要的消耗值是等于两个数的和,求最小的消耗值. 当然是贪心,每次排序后合并最小的两个值,再题弹出那两个值,压入两值之和.再继续刚才的步骤,直到只要一个了. 用sort肯定是超时的

UVa-10954

10954 - Add All Time limit: 3.000 seconds Yup!! The problem name reflects your task; just add a set of numbers. But you may feel yourselves condescended, to write a C/C++ program just to add a set of numbers. Such a problem will simply question your

uva--10954+贪心

题意: 输入n个数将它们相加.相加的时候每次只能选择2个数,然后定义这两个数的和为这一次相加的代价. 问以什么顺序相加可以使得总的代价最小. 思路: 从n个数中选2个数相加后然后问题就变成了n-1个数相加了,所以我们可以采取的一个贪心策略是每次都选 两个最小的数相加.具体实现的时候可以先对n个数排一下序,然后取前2个数相加,再将结果插入到原数组中(这是插入排序的思想,其实也可以每次都用快排排序,但那样很慢就是了.). 后面在网上看一下别人的解题报告,发现都说是哈夫曼树的模型,可以采用优先队列解决

周赛2(星期三之前补题完)

本厂做了3个水体,被略哭 水题1  暴力乱搞 题目: 回文数猜想 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4433    Accepted Submission(s): 2638 Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正