SHOW:
|
|
- or go back to the newest paste.
1 | Algorytm opiera się na obserwacji, że jeśli liczba x pojawiła się na wejsciu więcej, niż raz, to my jesteśmy zainteresowani jej ostatnim wystąpieniem. Dla przykładu: | |
2 | 7 5 8 9 5 4 4 | |
3 | Liczba 4 pojawiła się dwa razy, ale jej drugie wystąpienie jest dalej od każdej poprzedniej liczby, więc jej pierwsze wystąpienie nas nie interesuje. | |
4 | ||
5 | - | 1) w tablicy A trzymamy pierwsze wystąpienie liczby z indeksu, tzn A[i] mówi nam o pierwszym wystąpieniu budynku o wysokosci i |
5 | + | 1) w tablicy A trzymamy pierwsze wystąpienie liczby z indeksu, tzn A[i] mówi nam o pierwszym wystąpieniu liczby o wartosci i |
6 | ||
7 | 2) w tablicy B trzymamy ostatnie wystąpienie | |
8 | 3) sumujemy tablice B[1..n] tak, żeby w czasie stalym móc odpowiedzieć na pytanie, jaki jest max w tabllicy B[x..n] dla jakiegos x < n | |
9 | - | Robimy to w ten sposób (pozmieniaj coś xd): |
9 | + | Robimy to w ten sposób: |
10 | ||
11 | template <class T> | |
12 | void array_part_max (T *Source, size_t size) { // O(n) | |
13 | if (size >= 2) { | |
14 | for (long long int it = size - 2; it >= 0; --it) { | |
15 | if (Source[it] < Source[it+1]) | |
16 | Source[it] = Source[it+1]; | |
17 | } | |
18 | Source[size] = Source[size-1]; | |
19 | } | |
20 | } | |
21 | ||
22 | Do funkcji przekazujemy tablice B. Funkcja ta w B[x] zapisze max B[x..n] | |
23 | ||
24 | - | 4) Szukamy max z {B[i+1] - A[i] : 0 < i < maksymalna wysokosc budynku && budynek o wysokosci i występuje na wejsciu} |
24 | + | 4) Szukamy max z {B[i+1] - A[i] : 0 < i < maksymalna wprowadzona liczba && liczba i występuje na wejsciu} |
25 | 5) Odpowiedzią jest para (A[i], B[i+1]) | |
26 | ||
27 | Przykład: | |
28 | in: 6 4 5 1 3 1 | |
29 | A: -1 3 -1 4 1 2 0 (A[x] = -1 <=> x nie występuje na wejsciu) | |
30 | B: -1 5 -1 4 1 2 0 | |
31 | B: 5 5 4 4 2 2 2 (po użyciu przedstawionej funkcji) | |
32 | Szukamy max z {B[i+1] - A[i] : i należy do {1, 3, 4, 5} }, jest nim 2 - 1 = 1 dla i = 4 |