• 10.6上课——problem1切割木板(USACO 2006 November Gold)


     【问题描述】
    John 计划修理牧场的栅栏,为此他需要准备 N(1≤ N ≤20000)块特定 长度的木板。第 i 块木板的长度为 Li(1≤ Li ≤50000) 。John 买了一块很长 的木板,其长度正好等于所需要的 N 块木板长度总和。接下来当然要把它切割 开,假定切割木板的过程中没有任何损失。 切割一块木板的费用正比于木板的长度,比如,一块木板的长度为 21,那 么锯开它的费用就是 21 美分。John 可以自由的决定切割木板的顺序以及每次 切割的位置。很显然,按照不同的顺序切割木板最终的花费是完全不一样的,请 你帮助 John 计算出为了得到他所想要的木板,最少花费为多少?
    【输入】
    第一行一个整数 N,表示 John 需要的木板总数。接下来 N 行,每行一个整 数表示需要的木块长度。
    【输出】
    一个整数,表示 N-1 次切割的最小花费。
    【样例输入】
    3
    8
    5
    8
    【样例输出】
    34
    学习任务:
    huffman树构建与维护
    我的思路:
    用堆模拟huffman树求解
    本人题解:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int N=20005;
    int huff[N],n,n1=0;
    long long ans=0;
    void wh(int x,int y)
    {
        int temp;
        temp=huff[x];
        huff[x]=huff[y];
        huff[y]=temp;
    }
    int work()
    {
        int temp=huff[1],k,j;
        huff[1]=huff[n1--];
        j=1;
        while(j<=n1/2)
        {
            k=j*2;
            if(k<n1&&huff[k%2==1?k:k+1]<huff[k])
                k++;
            if(huff[k]>=huff[j])
                return temp;
            wh(j,k);
            j=k;
        }
        return temp;
    }
    int main()
    {
        freopen("plank.in","r",stdin);
        freopen("plank.out","w",stdout);
        int x,i,j,first,second;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            cin>>x;
            huff[++n1]=x;
            j=n1;
            while(j>1&&huff[j/2]>huff[j])
            {
                wh(j,j/2);
                j/=2;
            }
        }
        for(i=1;i<n;i++)
        {
            first=work();
            second=work();
            huff[++n1]=first+second;
            j=n1;
            while(j>1&&huff[j/2]>huff[j])
            {
                wh(j,j/2);
                j/=2;
            }
            ans+=first+second;
        }
        cout<<ans;
        return 0;
    }
    

    大神(NOIRP)思路:
    优·先·队·列
    优先队列构建
    主代码
    (该段大神代码因为不是本人原创,所以只能用图片了,抱歉了各位)

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Java类加载机制
    Java内存模型
    遍历集合的常见方式,排序,用lambda表示是怎样的
    包和访问权限修饰符,.单例设计模式,.Object类常用方法,.内部类
    接口
    继承
    面向对象的四大特征 封装 继承 多态 抽象
    面向对象
    二维数组及Arrays工具类
    数组(冒泡,选择,排序)
  • 原文地址:https://www.cnblogs.com/wuhu-xiaoshen/p/4918640.html
Copyright © 2020-2023  润新知