File tree Expand file tree Collapse file tree 1 file changed +44
-0
lines changed
rozwiazania/xx/etap3/dzien1/baj Expand file tree Collapse file tree 1 file changed +44
-0
lines changed Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments