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;
}


posted on 2011-12-31 17:02  Staginner  阅读(543)  评论(0编辑  收藏  举报