タイトル説明
ニックは、電子メールで送信された彼の上司を受け、インターネット上で毎日仕事に行く前に接続され、これらのメッセージは、各タスクが開始時間と期間で構成されて完了するために、その日の担当のすべてのタスクニック部門が含まれています。
作業ニックは最初の分からN番目の分の終わりに、N個分です。ニックは仕事に到着したとき、彼は仕事を始めました。やるべき複数のタスクがある場合は、ニックは何をするそれらのいずれかを選択することができ、そして彼の同僚による残りが完了し、いくつかのタスク場合は1つのタスクのみが、同時にニックでタスクを完了する必要がある場合には、一方、ニックは、ニックの同僚で、これらのタスクを完了するために取り組んでいる時間を開始します。タスクPの最初の分で開始した場合、継続時間はT分で、タスクは、P + T-1分で締結されます。
ニック・タスクが最も暇な時間を得るために選択されなければならないかを計算するプログラムを書きます。
入出力フォーマット
入力フォーマット:
二つの整数N及びK(1≤N≤10000,1≤K≤10000)を含む空間によって分離された入力データの最初の行は、Nは分単位で、Kは、タスクの総数を表し、ニック作業時間を表します。
次に、K行の合計は、各行が空間Tと整数Pによって分離された2つを有し、Pは、持続時間T minを1≤P≤N、1≤P+ T-1、開始からタスク分を表します≤N。
出力フォーマット:
出力ファイルのみ1行が、ニックは得るかもしれない最大の空いた時間を表す整数が含まれています。
サンプル入力と出力
入力サンプル#1:
コピー
6 15 1 2 1 6 4 11 8 5 8 1 11 5
出力サンプル#1:
コピー
4
問題解決法:DP・ラ・ラ
#include <cstdioを> する#include <iostreamの> する#include <CStringの> する#include <アルゴリズム> の#include <cmath> 使用して 名前空間STD。 INTの N、K、I、J、F [ 10005 ]、H、Z、V、C [ 10005 ]。// P [10005]、T [10005]。 構造体ノード { int型のP。 int型のトン。 } [ 10005 ]。 int型CMP(ノードX、ノードY) { 戻り XP < YP。 } int型のmain() { CIN >> N >> K。 にとって(i = 1 ; iは= Kを<; iは++ ) CIN >> [I] .P >> [I] .T。 ソート( + 1、A + K + 1 、CMP)。 F [K + 1 ] = 0 ; 以下のための(I = N; I> = 1 ; i-- ) { H = 0 ; V = 0 。 用(Z = K; Z> = 1 ; z-- ) { 場合([Z] .P == I) { H = 1 ; ++ V] = C 、Z。 } } 場合(H =!1)[I] = F F [I + 1 ] + 1 。 他 { 用(Z = 1 ; Z <= V; Z ++ ) { F [I] = MAX(F [[[Z] P C + [C [Z] T]、F [i])と; } } } COUT [F << 1 ] << ENDL。 リターン 0 ; }