フェンスの修理(貪欲、プライオリティキュー)

ファーマージョンは牧草地の周りのフェンスの小さな長さを修復したいと考えています。彼は、それぞれがいくつかの整数の長さのLi(1≤リー≤50,000)単位を有する、木材のN(1≤N≤2万)の厚板を必要としていることをフェンスや発見を測定します。彼はその後、Nの板にのこぎりにちょうど十分な長さの単一の長いボードを購入した(すなわち、その長さが長さのLiの和です)。FJは、「カーフ」、sawcutが行われおがくずに失われた余分な長さを無視しています。あなたも、それを無視すべきです。
FJは、悲しいことに、彼はこの長いボードでファーマードンの農場にオーバーmosiesと丁寧に、彼はのこぎりを借りてかどうかを尋ねるので、彼は、木材をカットするとのこぎりを所有していないことに気付きます。
ファーマードン、クローゼットの資本主義は、FJにのこぎりを貸す代わりに厚板でN-1カットごとにファーマージョンを充電するために提供しません。木材の一片を切断する電荷は、その長さに正確に等しいです。長さ21の板をカットすると21セントの費用がかかります。
ファーマードンは、農夫ジョンが厚板をカットするためと場所を決めることができます。ヘルプファーマージョンは、彼がNの板を作成するために使うことができるお金の最小量を決定します。FJは、彼が得られた中間体の厚板の長さが異なるので、異なる料金が発生します様々な異なる順序でボードをカットすることができることを知っています。
入力

   Line 1: One integer 
   N, the number of planks 

ライン2 ...
N + 1:各行は、必要と厚板の長記述単一整数含ま
出力の

   Line 1: One integer: the minimum amount of money he must spend to make 
   N-1 cuts
  Sample Input3

8
5
8Sample Output34Hint

   He wants to cut a board of length 21 into pieces of lengths 8, 5, and 8. 

原盤は8 + 5 + 8 = 21を測定します。最初のカットは21の費用がかかり、及び第二カット13の費用がかかります、そしてこれは21 + 13 = 34の​​費用であろう8および5に13を切断するために使用されなければならない13および8を測定片にボードを切断するために使用されるべきです。21に代えて16と5に切断した場合、第二カット(以上34である)37の合計16の費用がかかるであろう。

Nブロック(L1 ... LN)に分けボードについてのタイトルの話は、各カットはカットする木材の長さをとり、最小コストを見つけます

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <string>
#include <queue>
#include <vector>
#define sqr(x) (x)*(x)
#define inf 0x3f3f3f3f
#define PI 3.1415926535
#define mm 20001
using namespace std;
int n,l,ans=0;
int main()
{
 cin>>n;
 priority_queue<int, vector<int>, greater<int> > que; for(int i=0;i<n;i++)
 {
  cin>>l;
  que.push(l);
 }
 while(que.size()>1)
 {
  int l1,l2;
  l1=que.top();
  que.pop();
  l2=que.top();
  que.pop();
  ans+=l1+l2;
  que.push(l1+l2);
 }
 printf("%lld\n",ans);
}
公開された12元の記事 ウォンの賞賛1 ビュー198

おすすめ

転載: blog.csdn.net/csx_zzh/article/details/105055725