哈夫曼|POJ 3253 Fence Repair (哈夫曼编码基础)
POJ 3253
用了哈夫曼编码的思想
参考博客:http://blog.csdn.net/lyy289065406/article/details/6647423
【哈夫曼|POJ 3253 Fence Repair (哈夫曼编码基础)】
#include
#include
#include
#include
#include
using namespace std;
long long L[20010];
int main() {
int n;
while(~scanf("%d", &n)) {
int i, j;
for(i = 0 ;
i < n;
i++) {
scanf("%I64d", L + i);
}
sort(L, L + n);
long long minn = 0, sum;
for(i = 0;
i < n - 1;
i++) { //n - 1 次后就剩下一根木棍了,此时停止
sum = L[i] + L[i + 1];
minn += sum;
for(j = i + 2;
j < n;
j++) {
if(sum > L[j]) {
L[j - 1] = L[j];
//向后移动
if(j == n - 1) {//到了最后一根时放最后
L[j] = sum;
}
}
else {
L[j - 1] = sum;
//找到位置
break;
}
}
}
printf("%I64d\n", minn);
}
return 0;
}
挑战程序设计竞赛,代码:
#include
#include
#include
#include
using namespace std;
int a[20100];
int main() {
int n;
while(~scanf("%d", &n)) {
int i, j;
for(i = 0;
i < n;
i++) {
scanf("%d", a + i);
}
long long ans = 0;
while(n > 1) {
int mini1 = 0, mini2 = 1;
if(a[mini1] > a[mini2]) swap(mini1, mini2);
for(i = 2;
i < n;
i++) {
if(a[mini1] > a[i]) {
mini2 = mini1;
mini1 = i;
}
else if(a[mini2] > a[i]) {
mini2 = i;
}
}
int sum = a[mini1] + a[mini2];
ans += sum;
if(mini1 == n - 1) swap(mini1, mini2);
a[mini1] = sum;
a[mini2] = a[n - 1];
n--;
}
printf("%lld\n", ans);
}
return 0;
}
推荐阅读
- 模板 poj2947 Widget Factory 高斯消元
- POJ 1027 The Same Game 模拟题
- POJ 2728 Desert King(最优比率生成树)
- 图论|POJ1364 King 差分约束
- POJ 1364 King 差分约束系统
- poj2728|poj2728 Desert King
- SPOJ DISUBSTR - Distinct Substrings or SUBST1 - New Distinct Substrings 【不同子串数目】
- POJ|POJ2728 Desert King
- OJ|POJ 2686 Traveling by Stagecoach (状态压缩DP)
- poj|poj 8469 特殊密码锁