動的なプログラミングのアイデア:
https://blog.csdn.net/huang1600301017/article/details/81022658
貪欲アルゴリズムの訓練:
https://blog.csdn.net/EliminatedAcmer/article/details/88402667
https://blog.csdn.net/gyhguoge01234/article/details/78156417
思考:ジョンソンアルゴリズム:
1の2つのタスク、タスククラスT1 <T2、タスククラスBのT1> T2 =に分割
2は、2つのタスクは、クラスAによって順序付けされる昇順T1、カテゴリBに従って降順にT2
3:2種類の、最初のクラスの後に2番目のタスクにタスクの種類、最高の仕事の後、一連のマージ
4:すべてのタスクを通じて、合計時間を計算し
、私はそれを理解すると言うの下に、それは間違いなく、T1のために仕事されています従って、実行、ジョブt2のアイドル状態が存在することになると最小時間がかかり、明らかに許可されていない空き状況に応じて、状況の二種類を重ね、第1ジョブT1 <T2とT1実行の増加順に従って可用性は、残りの操作に、表示されない場合、T1> T2 =ジョブは、ジョブが蓄積、T2のままで、場合ジョブごとに、T1 = T2以降、T2ジョブ積層仕事>加工意志でありますそれが最小になるように最初は、T2の降順にそれでは、T1> = T2ジョブの実行、最終的にT2以上増加保持は時間がかかるであろう、大T2の最初の実装であろうように、ますます小さくなって消費します。
/ * ジョンソンアルゴリズム: 1の2つのタスク、タスククラスT1 <T2、タスククラスBのT1> T2 =に分割 2:2つのタスクは、クラスAによって順序付けされる昇順T1、カテゴリBに従って降順にT2 3:2つのタスクにタスクの第一のタイプの背後にある第2のタイプのタスク最良の現時点で配列マージ すべてのタスク、合計時間を計算するスルー:4 * / の#include <iostreamの> する#include <アルゴリズム> 使用して 名前空間を; STD のtypedef ロング ロングLL、 構造体ノード{ int型の時間; INT ID; BOOL グループ; BOOLの 演算子 <(constのノード&P){ 戻り時間< p.timeを; } }; のconst int型MAX_N = 50005 ; int型のn; INT [MAX_N]、[MAX_N] B。 ノードD [MAX_N]。 INT [MAX_N]最高。 int型のmain() { IOS :: sync_with_stdio(偽); cinを >> N; 以下のために(int型 i = 0 ; iがn <; iは++ ) CIN >> [I] >> B [i]は、 以下のために(int型 i = 0 ; iは<N; iは++ ){ D [i]は.timeは = [I]> [I] B?B [I]:[i]は、 D [i]は.ID = iは、 D [i]は.group= [I] <=のB [i]は、 } ソート(D、D + N)。 INTは L = 0、R = N- 1 ; 以下のために(int型私= 0 ; iがN <; I ++の) 場合(D [i]が.group)最良[L ++] = D [i]は.ID。 他に 最高の[R - ] = D [i]の.ID。 LL和 = 0、ANS = 0 。 以下のために(int型 i = 0 ; iがn <; iは++ ) { 合計 + = [ベスト[I]]。 ANS = MAX(ANS、和)+ B [ベスト[I]]。 } COUT << ANS << ENDL。 // ため(= 0 Iにint型、iがn <; iは++) // のprintf( "%dの"、最良[I] +1)。 // printfの( "\ n")を。 リターン 0 ; }
https://blog.csdn.net/qq_39382769/article/details/81396518