zoukankan      html  css  js  c++  java
  • UVA 10954 Add All

    UVA_10954

        看了别人解题报告之后发现累加的过程可以这样操作,每次取最小的两个元素加和,然后把和当作一个新元素放进集合,直到剩下一个元素,然后把中间结果加起来就是要求的结果。实际上这个题目就是哈弗曼编码,在LRJ树上155页有讲到。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define MAXD 5010
    int N, a[MAXD], q[MAXD];
    int cmp(const void *_p, const void *_q)
    {
    int *p = (int *)_p;
    int *q = (int *)_q;
    return *p - *q;
    }
    void solve()
    {
    int i, j, ans, cur, front, rear, x[2];
    for(i = 0; i < N; i ++)
    scanf("%d", &a[i]);
    qsort(a, N, sizeof(a[0]), cmp);
    cur = front = rear = 0;
    for(i = 1; i < N; i ++)
    {
    for(j = 0; j < 2; j ++)
    {
    if(cur != N)
    {
    x[j] = a[cur];
    if(front == rear || q[front] >= x[j])
    ++ cur;
    else
    x[j] = q[front ++];
    }
    else
    x[j] = q[front ++];
    }
    q[rear ++] = x[0] + x[1];
    }
    for(i = ans = 0; i < rear; i ++)
    ans += q[i];
    printf("%d\n", ans);
    }
    int main()
    {
    for(;;)
    {
    scanf("%d", &N);
    if(!N)
    break;
    solve();
    }
    return 0;
    }


  • 相关阅读:
    3.5.3 数据排序;重复数值、缺失值处理
    3.5.1 pandas基础
    3.3 numpy
    数据准备和特征工程
    2.4函数
    2.3语句与控制流
    2.2数据结构与序列
    2.1Python基础知识
    五、MySQL安装
    四、Hadoop HA 集群搭建
  • 原文地址:https://www.cnblogs.com/staginner/p/2308941.html
Copyright © 2011-2022 走看看