https://www.luogu.org/problem/P2949
タイトル説明
ファーマージョンはやることが非常に多くの仕事を持っています!効率的にファームを実行するためには、彼は一人一人は、ちょうど1時間単位を取り、彼は仕事でお金を稼ぐ必要があります。
彼の仕事の日は、時間0から始まり、10億時間単位を持っています(!)。彼は現在、N(1 <= N <=10万)便利な作業が行うため1..Nの番号が付けられたジョブのいずれかから選択することができます。それは可能ですが、彼は唯一の任意の時間単位中に1つの仕事に取り組むことができ、締め切りは彼がすべてのタスクを実行できないほど低下する傾向があるので、彼はすべてのNの仕事のための時間を持っていることは極めてまれです。
仕事私は(1 <=ディ<= 1,000,000,000)を期限ディを持っています。彼はそれまでに私の仕事を終了した場合、彼はパイ(1 <=パイ<= 1,000,000,000)をの利益になります。
FJは仕事と期限を与えられたリストから獲得することができ、最大総利益は何ですか?答えは、32ビットの整数に適合しない場合があります。
説明を入力します。
* 1行目:単一の整数:N
*行2..N + 1:ディとPI:i線+ 1は2スペースで区切られた整数が含まれています
出力説明:
* 1行目:FJを稼ぐことができる可能な最大の利益である単独行上の単一の番号。
エントリー
3 2 10 1 5 1 7
輸出
17
説明
利益( - > 17 7 + 10)を最大化するための時間2における時刻1と完全ジョブ1(2,10)で完全ジョブ3(1,7)。
各項目のコストが、異なる値と同じ。だから、制限を満たしていた場合には、当社が商品の可能な最大値を選択します、想像するのは簡単です。
我々はそれを達成するためにバックパックを使用することができ、答えはノーであるか、私にはありませんQwQ
さて、貪欲見てみましょう
最初のアイデアは、時間に応じてソートされ(ないこと1E8は、ああ、カットオフ日である)、そして、仕事をする時間があるならば、彼らが最初にやることは、(奇妙に聞こえる)、それは小さなヒープルートに押し込ま価値があります。
私たちは現在の仕事よりもヒープの高いトップ、それは価値が見つからない場合は、我々はそれが、このより価値の高い作業を行うのですかする時間だ、その最低限の仕事をあきらめます。
1の#include <stdio.hの> 2の#include < ストリング・H> 3の#include <iostreamの> 4の#include < ストリング > 5の#include <math.h>の 6の#include <アルゴリズム> 7の#include <キュー> 8#含む< 設定 > 9の#include <math.h>の 10 のconst int型 INF = 0x3f3f3f3f 。 11 typedefの長い 長いLL。 12 のconst int型 MOD = 1E9 + 7 。 13 のconst ダブルPI = ACOS( - 1 )。 14 のconst int型 MAXN = 1E5 + 10 。 15 使って 名前空間はstdを、 16 17 構造体ノード 18 { 19 のint T。 20 INT M。 21 } [ 100010 ]。 22の 23 LL ANS。 24 PRIORITY_QUEUE < INT、ベクトル< INT >、大きな< INT >> Q。 25 ブールCMP(ノードA、ノードB) 26 { 27 リターンで<BT; 28 } 29 30 のint main()の 31 { 32 INT N。 33 のscanf(" %d個"、&N) 34 のために(int型 i = 1 ; iが<= N; iが++ ) 35 { 36 のscanf(" %d個の%のD "、および[I] .T、および[I] .M)。 37 } 38 ソート(+ 1、A + 1 + N、CMP)。 39 のための(int型 I = 1; iが<= N; iは++ ) 40 { 41 であれば([I] .T <= q.size()) 42 { 43 であれば([I] .M> q.top()) 44 { 45 ans- = q.top()。 46 q.pop()。 47 q.push([I] .M)。 48の ANS + = A [i]の.M。 49 } 50 } 51 他の 52 { 53 q.push([I] .M)。 54の ANS + = A [i]の.M。 55 } 56 } 57 のprintf(" %LLDする\ n " 、ANS)。 58 リターン 0 ; 59 }