Raspored poslova
Problem 4: Raspored poslova
Zadan je broj . U sljedećih redova zadano je po dva broja, i , koji označavaju početno i krajnje vrijeme posla . Samo jedan posao se može obavljati u isto vrijeme. Posao se obavlja u vremenskom intervalu (uključno).
Vrijedi , .
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 počinje sa tezom:
- pretpostavimo da dolazimo do nekog optimalnog rješenja koji ne bi pronašao algoritam .
Izraz nekog bitan je zbog mogućnosti postojanja više optimalnih rješenja. Izraz "ne bi pronašao algoritam " u kombinaciji s definicijom implicira da je u rješenju postoji prvo odudaranje od algoritma , to jest trenutak kad smo mogli izabrati ono što bi birao algoritam , a nismo.
Na primjer, rješenje je lista poslova koja počinje listom , zatim poslom , a završava listom . Posao označava trenutak kad smo mogli odabrati posao (kojeg bi odabrao ), a nismo.
Po definiciji taj posao smo mogli odabrati, a završava prije . Zbog toga je lista - - isto tako dobra lista poslova ( ne smeta poslovima poslije jer završava prije ). Dakle, uzimanjem posla umjesto 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.