Preskoči na glavni sadržaj

Raspored poslova

Problem 4: Raspored poslova

Zadan je broj kk. U sljedećih kk redova zadano je po dva broja, aia_i i bib_i, koji označavaju početno i krajnje vrijeme posla ii. Samo jedan posao se može obavljati u isto vrijeme. Posao se obavlja u vremenskom intervalu [ai,bi][a_i, b_i] (uključno).

Vrijedi 1k1061 \leq k \leq 10^6, 0ai,bi1090 \leq a_i, b_i \leq 10^9.

Koliko je najviše poslova moguće obaviti?

Testni primjeri

Pokušajte razviti pohlepni pristup i iskušajte ga na sljedećim primjerima:

3
1 5
2 2
3 10

Rješenje: 2

3
1 3
2 2
3 3

Rješenje: 2

Pokušajte dokazati optimalnost vašeg pristupa!

Pohlepni pristup:

Poslove je potrebno sortirati prema vremenu završetka (od najmanjeg prema najvećem). Zatim je potrebno izvršavati poslove redom, i paziti da se ne preklapaju s već izvršenima.

#include <bits/stdc++.h>
using namespace std;

int main(){
int k; cin>>k;

vector<pair<int,int>> P(k);
for (int i=0; i<k; i++){
int a,b; cin>>a>>b;
P[i] = {a,b};
}

sort(P.begin(), P.end(),
[](auto p1, auto p2) -> bool{return p1.second < p2.second;}
);

int last_time = -1;
int cnt = 0;

for (auto p : P){
if (p.first > last_time){
cnt++;
last_time = p.second;
}
}

cout << cnt << endl;
}

Dokaz:

Gotovo svaki dokaz optimalnosti pohlepnog algoritma AA počinje sa tezom:

  • pretpostavimo da dolazimo do nekog optimalnog rješenja koji ne bi pronašao algoritam AA.

Izraz nekog bitan je zbog mogućnosti postojanja više optimalnih rješenja. Izraz "ne bi pronašao algoritam AA" u kombinaciji s definicijom AA implicira da je u rješenju postoji prvo odudaranje od algoritma AA, to jest trenutak kad smo mogli izabrati ono što bi birao algoritam AA, a nismo.

Na primjer, rješenje je lista poslova koja počinje listom X1X_1, zatim poslom xx, a završava listom X2X_2. Posao xx označava trenutak kad smo mogli odabrati posao zz (kojeg bi odabrao AA), a nismo.

Po definiciji taj posao zz smo mogli odabrati, a završava prije xx. Zbog toga je lista X1X_1 - zz - X2X_2 isto tako dobra lista poslova (zz ne smeta poslovima poslije jer završava prije xx). Dakle, uzimanjem posla zz umjesto xx dobivamo barem jednako dobro rješenje.

Zaključak je da koje god rješenje imamo, postupanje pohlepnog algoritma nam daje bar jednako dobro rješenje kao što imamo - pohlepni algoritam je optimalan.

Apstraktni pregled dokaza

Dokaz se svodi na razmatranje rješenja koje odudara od pohlepnog algoritma, a zatim pokazivanje da se prelaskom na odluke koje bi činio pohlepni algoritam dobiva barem jednako dobro rješenje.

Pokušajte sljedeći problem riješiti (i dokazati rješenje) na sličan način. Razmotrite vaš postupak u svakom koraku, i razmislite postoji li neki koji je uvijek barem jednako dobar.