#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n /* dlugosc sciezki*/, k /* maks dozwolona roznica poziomow plytek*/;
cin >> n >> k;
vector<int> wys(n);
for (int i = 0; i < n; i++)
{
cin >> wys[i];
}
if (n == 1)
{
/* jak jest tylko jedna plytka to na pewno nic nie musimy robic */
cout << "0\n";
return (0);
}
/* tu bede tylko dla sciezek zlozonych z co najmniej 2 plytek */
int ciez = 0; /* ile ciezarowek potrzebujemy */
int curr = 0, delta;
bool stop = false;
while (!stop)
{
// probujemy zlapac spojny podciag scisle rosnacy
while (curr + 1 < n && wys[curr + 1] > wys[curr])
curr++;
// teraz dociagamy lewa strone w gore do pierwszego napotkanego maksa
for (int i = curr - 1; i >= 0 && wys[i + 1] - wys[i] > k; i--)
{
delta = max(wys[i + 1] - wys[i] - k, 0);
ciez += delta;
wys[i] += delta;
}
// tak dlugo jak jest rowno, to nic nie robimy
while (curr + 1 < n && wys[curr + 1] == wys[curr])
curr++;
int last_stop = curr;
// probujemy zlapac podciag scisle malejacy
while (curr + 1 < n && wys[curr + 1] < wys[curr])
curr++;
// teraz dociagamy prawa strone w gore do poprzedniego napotkanego maksa
for (int i = last_stop + 1; i < n && wys[i - 1] - wys[i] > k; i++)
{
delta = max(wys[i - 1] - wys[i] - k, 0);
ciez += delta;
wys[i] += delta;
}
// sprawdzamy czy nie koniec
if (curr >= n - 1)
stop = true;
}
cout << ciez << "\n";
return (0);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n /* dlugosc sciezki*/, k /* maks dozwolona roznica poziomow plytek*/; cin >> n >> k; vector<int> wys(n); for (int i = 0; i < n; i++) { cin >> wys[i]; } if (n == 1) { /* jak jest tylko jedna plytka to na pewno nic nie musimy robic */ cout << "0\n"; return (0); } /* tu bede tylko dla sciezek zlozonych z co najmniej 2 plytek */ int ciez = 0; /* ile ciezarowek potrzebujemy */ int curr = 0, delta; bool stop = false; while (!stop) { // probujemy zlapac spojny podciag scisle rosnacy while (curr + 1 < n && wys[curr + 1] > wys[curr]) curr++; // teraz dociagamy lewa strone w gore do pierwszego napotkanego maksa for (int i = curr - 1; i >= 0 && wys[i + 1] - wys[i] > k; i--) { delta = max(wys[i + 1] - wys[i] - k, 0); ciez += delta; wys[i] += delta; } // tak dlugo jak jest rowno, to nic nie robimy while (curr + 1 < n && wys[curr + 1] == wys[curr]) curr++; int last_stop = curr; // probujemy zlapac podciag scisle malejacy while (curr + 1 < n && wys[curr + 1] < wys[curr]) curr++; // teraz dociagamy prawa strone w gore do poprzedniego napotkanego maksa for (int i = last_stop + 1; i < n && wys[i - 1] - wys[i] > k; i++) { delta = max(wys[i - 1] - wys[i] - k, 0); ciez += delta; wys[i] += delta; } // sprawdzamy czy nie koniec if (curr >= n - 1) stop = true; } cout << ciez << "\n"; return (0); } |
English