• POJ 3253 Fence Repair(优先队列,哈夫曼树,模拟)


    题目

    //做哈夫曼树时,可以用优先队列(误?)

    //这道题教我们优先队列的一个用法:取前n个数(最大的或者最小的)

    //哈夫曼树
    //64位
    //超时->优先队列,,,,
    //这道题的优先队列用于取前2个小的元素
    
    #include <iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    __int64 ans,a[20010];
    int n;
    
    struct cmp
    {  
        bool operator ()(__int64 &a,__int64 &b){  
            return a>b;
        }  
    };
    
    priority_queue<__int64,vector<__int64>,cmp> q;
    
    void hfm()
    {
        
        __int64 min1,min2,neww,yi;
        while(n>1)
        {
            yi=0;
            min1=q.top();
            q.pop();
            min2=q.top();
            q.pop();
            neww=min1+min2;
            ans+=neww;
            q.push(neww);
            n--;
        }
    }
    
    int main()
    {
        int i;
        while(scanf("%d",&n)!=EOF)
        {
            while(!q.empty())q.pop();
            for(i=0;i<n;i++)
            {
                scanf("%I64d",&a[i]);
                q.push(a[i]);
            }
            ans=0;
            if(n>1)
                hfm();
            else
                ans=a[0];
            printf("%I64d
    ",ans);
        }
        return 0;
    }
    View Code

    //这是我旁边的小学妹写的,不用优先队列也不会超时,可以过耶,我脑子太不灵光了,,,居然一直没想到,,,

    //小学妹的AC代码留念:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    
    using namespace std;
    
    int main()
    {
        int n,length[20010];
        int i,j,sum;
        __int64 ans;
        while(cin>>n)
        {
            for(i=0;i<n;i++)
                cin>>length[i];
            sort(length,length+n);
            sum = 0;
            ans = 0;
            for(i=0;i<n-1;i++)
            {
                sum = length[i] + length[i+1];
                ans += sum;
                for(j=i+2;j<n;j++)
                {
                    if(sum > length[j])
                        length[j-1] = length[j];
                    else
                    {
                        length[j-1] = sum;
                        break;
                    }
                }
                if(j==n)
                    length[j-1] = sum;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code
    一道又一道,好高兴!
  • 相关阅读:
    SQL Server 错误(待补充)
    PageLayoutControl的基本操作
    C#:MapControl基本操作代码整理
    ArcGis10.0常见错误
    TocControl控件图层无法显示问题
    ArcGIS 10 安装程序及破解文件
    C# 中运行exe程序
    MySQL触发器更新本表数据异常:Can't update table 'tbl' in stored function/trigger because it
    使用ZBar来读取条形码和二维码的方法
    初识MongoDB
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3808955.html
Copyright © 2020-2023  润新知