Skip to content

Commit a574b2c

Browse files
committed
Dodano rozwiązanie zadania 'Bajtokomputer' z XX OI
1 parent 74430a7 commit a574b2c

File tree

1 file changed

+44
-0
lines changed
  • rozwiazania/xx/etap3/dzien1/baj

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Rozwiązanie zadania 'Bajtokomputer' z III etapu XX OI.
2+
// Autor: Paweł Putra
3+
// Złożoność czasowa: O(n)
4+
// Złożoność pamięciowa: O(n).
5+
6+
7+
#include <iostream>
8+
#include <algorithm>
9+
using namespace std;
10+
constexpr int MAXN = 1'000'005, INF = 1'000'000'000;
11+
// dp[i][x] = koszt uzyskania posortowanego ciągu kończącego się na x - 1.
12+
int dp[MAXN][3];
13+
int x[MAXN];
14+
int32_t main() {
15+
ios_base::sync_with_stdio(0);
16+
int n;
17+
cin >> n;
18+
19+
if (n == 1) {
20+
cout << "0\n";
21+
return 0;
22+
}
23+
24+
// Nie opłaca się wykraczać jakąkolwiek wartością ciągu poza zbiór {-1, 0, 1}.
25+
for (int i = 1; i <= n; i++) {
26+
cin >> x[i];
27+
for (int j = 0; j < 3; j++)
28+
dp[i][j] = INF;
29+
}
30+
dp[1][x[1] + 1] = 0;
31+
for (int i = 2; i <= n; i++) {
32+
for (int ostatni = -1; ostatni <= 1; ostatni++) {
33+
for (int teraz = ostatni; teraz <= 1; teraz++) {
34+
// Dodając zero nic nie zmienimy.
35+
if (ostatni == 0 && x[i] != teraz) continue;
36+
dp[i][teraz+1] = min(dp[i][teraz+1], dp[i-1][ostatni + 1] + abs(teraz - x[i]));
37+
}
38+
}
39+
}
40+
41+
int wynik = min({dp[n][0], dp[n][1], dp[n][2]});
42+
if (wynik >= INF) cout << "BRAK\n";
43+
else cout << wynik << "\n";
44+
}

0 commit comments

Comments
 (0)