Problem : A | B | C | D | E | F | G | H

## E - Makan Sepuasnya

Inti permasalahan pada soal ini adalah sama dengan Activity Selection Problem, di mana waktu mulai setiap activity adalah t + d sedangkan waktu selesainya adalah t + d + e. Soal ini bisa diselesaikan secara greedy dengan memilih activity yang selesai lebih dulu.

Statistik Problem E
YES = 3
NO - Wrong Answer = 10
NO - Time Limit Exceeded = 6
NO - Run-time Error = 1
NO - Compile Error = 0

 Solusi C/C++   (oleh Suhendry Effendy) ```#include #include using namespace std; struct food { int start; int finish; }; bool operator < (const food &a, const food &b) { return a.finish < b.finish; } food arr[100005]; int main() { int T; scanf( "%d", &T ); while ( T-- ) { int n, t, d, e; scanf( "%d", &n ); for ( int i = 0; i < n; i++ ) { scanf( "%d %d %d", &t, &d, &e ); arr[i] = (food){t+d,t+d+e}; } sort(arr,arr+n); int ans = 0, last = -1; for ( int i = 0; i < n; i++ ) { if ( arr[i].start >= last ) { ans++; last = arr[i].finish; } } printf( "%d\n", ans ); } return 0; } ``` Solusi Pascal   (oleh Eko Wibowo) ```type food = record start, finish : longint; end; tlist = array[1..100000] of food; var t,d,e,n,i,tcase,ans,last : longint; arr : tlist; // diambil dari contoh pada free-pascal procedure sort(var a:tlist;l,r: longint); var i, j : longint; x, y : food; begin i := l; j := r; x := a[(l + r) div 2]; repeat while a[i].finish < x.finish do i := i + 1; while x.finish < a[j].finish do j := j - 1; if i <= j then begin y := a[i]; a[i] := a[j]; a[j] := y; i := i + 1; j := j - 1; end; until i > j; if l < j then sort(a,l,j); if i < r then sort(a,i,r); end; begin read(tcase); while (tcase>0) do begin tcase := tcase - 1; read(n); for i := 1 to n do begin read(t,d,e); arr[i].start := t + d; arr[i].finish := t + d + e; end; sort(arr,1,n); ans := 0; last := -1; for i := 1 to n do if (arr[i].start >= last) then begin ans := ans + 1; last := arr[i].finish; end; wrans); end; end. ```