FenceRepair
TimeLimit: 2000MS Memory Limit: 65536KB
SubmitStatistic
Farmer John wants to repair a small length of the fencearound the pasture. He measures the fence and finds that he needs N (1≤ N ≤ 20,000) planks of wood, each having some integerlength Li (1 ≤ Li ≤ 50,000)units. He then purchases a single long board just long enough to saw intothe N planks (i.e., whose length is the sum of thelengths Li). FJ is ignoring the "kerf", theextra length lost to sawdust when a sawcut is made; you should ignore it, too.
FJ sadly realizes that he doesn/'t own a saw with whichto cut the wood, so he mosies over to Farmer Don/'s Farm with this long boardand politely asks if he may borrow a saw.
Farmer Don, a closet capitalist, doesn/'t lend FJ a sawbut instead offers to charge Farmer John for each of the N-1 cutsin the plank. The charge to cut a piece of wood is exactly equal to its length.Cutting a plank of length 21 costs 21 cents.
Farmer Don then lets Farmer John decide the order andlocations to cut the plank. Help Farmer John determine the minimum amount ofmoney he can spend to create the N planks. FJ knows that hecan cut the board in various different orders which will result in differentcharges since the resulting intermediate planks are of different lengths.
Input
Line 1:One integer N, the number of planks
Lines 2..N+1:Each line contains a single integer describing the length of a needed plank
Output
Line 1:One integer: the minimum amount of money he must spend to make N-1cuts
Example Input
3
8
5
8
Example Output
34
Hint
Author
#include <iostream>#include<string.h>#include<stdio.h>#include<queue>#include<stdlib.h>#include<algorithm>using namespace std;long long sum;int h[10002];int main(){    priority_queue<int,vector<int>,greater<int> >q;    int n,i,a,b,c;    scanf("%d",&n);    for(i=0;i<n;i++)    {        scanf("%d",&h[i]);        q.push(h[i]);    }    sum = 0;    while(!q.empty())    {        a = q.top();        q.pop();        if(!q.empty())        {           b = q.top();           q.pop();           c = a+b;           q.push(c);           sum += c;        }    }    printf("%lld/n",sum);    return 0;}/*題目大意:FJ需要修補牧場的圍欄,他需要 N 塊長度為 Li 的木頭(N planks of woods)。開始時,FJ只有一塊無限長的木板,因此他需要把無限長的木板鋸成 N 塊長度為 Li 的木板,Farmer Don提供FJ鋸子,但必須要收費的,收費的標準是對應每次據出木塊的長度,比如說測試數據中 5 8 8,一開始,FJ需要在無限長的木板上鋸下長度 21 的木板(5+8+8=21),第二次鋸下長度為 5 的木板,第三次鋸下長度為 8 的木板,至此就可以將長度分別為 5 8 8 的木板找出題目可以轉化為Huffman樹構造問題 :給定 N planks of woods,1.   在 N planks 中每次找出兩塊長度最短的木板,然后把它們合并,加入到集合A中,2.  在集合中找出兩塊長度最短的木板,合并加入到集合A中,重復過程,直到集合A中只剩下一個元素顯然,通過每次選取兩塊長度最短的木板,合并,最終必定可以合并出長度為 Sum(Li)的木板,并且可以保證總的耗費最少*//***************************************************User name: jk160505徐紅博Result: AcceptedTake time: 12msTake Memory: 428KBSubmit time: 2017-02-09 09:41:23****************************************************/ 
新聞熱點
疑難解答