ホリデーシーズンのチームオフ牛2つのCの修理フェンス(ハフマン木、貪欲)

リンク:https://ac.nowcoder.com/acm/contest/924/C
出典:牛オフネットワーク

フェンスの修理
時間制限:C / C ++ 1秒、2秒言語、他の
スペースの制限:C / C ++ 32768K、他の言語65536kも
64ビットIOフォーマット:%LLDの
対象記述
農夫ジョンが農場の周りに小さなフェンスを修復したいと考えています。彼が測定され、必要N(1 <= N <=見出さ 2万) 木片、それぞれが特定の整数の長さL(1 <=リー<=有する 50,000) 単位長さ当たりの。彼はちょうど彼が木のNピースが必要だと見たために、長い長い木材を買いました。FJはカーフ、無視できる程度の生産長ソーイングおがくずの損失を無視する(すなわち、その長さは、Liの合計と正確に等しい)、あなたはそれを無視することができます。
FJは残念ながら、彼は木材を切断するための鋸を見つけられませんでしたので、彼は長い木製フラナガンはのこぎりを借りて彼を求めるために、農家ドンファームに来ました。
農民ドンは、保守的な資本主義は、彼が見たFJを借りたくなかったが、N-1は、それぞれの時間はFJを充電、自分のナイフをカットしていく所存です。オカナガンの合計の長さと正確に一致するたびに料金があなたの木を見ました。たとえば、あなたが木材21の長さを見て、それが21セントの費用がかかります。
その後、農民ドンジョンと農家がそれぞれ、ソーイング木の順序と位置を決めましょう。ジョンは農家が木材のNピースの最小総コストを決定するのを助けるために見ました。FJは異なる切断方法の様々な構造を有することができ、さまざまな方法が原因でソーイング木材の様々な長さの過程にある異なる総コストを得ることができる知っています。
入力説明:
行1:木材鋸引きされる整数N、数
各木材の長さを表す各整数に対するライン:ライン2..N + 1。
出力説明:
1行目:彼はセントの最小数を必要とすることが整数、N-1の下を見て、木のすべてのニーズを見ました。
例1
入力
コピー
。3
8
5
8
出力
のコピー
34個
の指示
彼は木8、5および8ソーイング3種類の長さの木材21の合計の長さから必要です。
8 + 5 + 8 = 21の木材元の長さ。最初は、鋸21のコストであり、それは、それぞれ、2つの長さ13及び8に切断されなければなりません。第二のコストは、製材木材13 8と5の長さは13です。総コストは21 + 13 = 34です。しかし、第16及び21製材5た場合、それは37の総コスト(34より大きい)で得られた、16秒かかります。

質問の意味:思考:古典的な問題ではなく、裸で、ハフマン木され、私たちは木についてのすべてのカットは、木材の二つの新しい作品を生み出す、最終的に全体のプロセスは、バイナリツリーを構成するであろう、と最小のコストをしたいことを知って、そう最適二分木の古典的な問題は、ハフマンツリーにも最適なツリーとして知られている(ハフマン木)は、そのリーフノードNの所与のn番目の重み、二分木構造、もし最小加重経路の長さを意味しますこのようなバイナリツリーを言うことも、ハフマン符号(ハフマン木)として知られている最適なバイナリツリーです。ハフマンツリーは、最短経路長加重ツリー、近いルートノードから大きな重みです。ツリーノードが値を割り当てられた特定の意味を持っている場合、この値は右ノードと呼ばれています。



だから我々は、設定を逆にこの質問は、あなたが木材の二枚(木材カット逆のプロセス)をマージします、木材の二枚の現在の最小長取り除くたびに小さなスタックルートを開くことができ、コストがブロックを組み合わせた長さである、となっていますこのように、変数の値LONGLONGと時間1の終了まで木の個数は、答えを記録します。

詳細コードを参照してください。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n;
priority_queue<int,vector<int>,greater<int> > heap;
int main()
{
    //freopen("D:\\code\\text\\input.txt","r",stdin);
    //freopen("D:\\code\\text\\output.txt","w",stdout);
    
    gg(n);
    int x;
    repd(i,1,n)
    {
        gg(x);
        heap.push(x);
    }
    ll ans=0ll;
    int y;
    while(heap.size()>1)
    {
        x=heap.top();
        heap.pop();
        y=heap.top();
        heap.pop();
        ans+=1ll*(x+y);
        heap.push(x+y);
    }
    printf("%lld\n",ans );
    
    
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}

おすすめ

転載: www.cnblogs.com/qieqiemin/p/11022488.html