#include <iostream>
#include <algorithm>
#include <utility>
using namespace std;
static int n, k, iUsed, iBestDiffIndex, iBestDiffTop;
static int aHeights[1024];
static int aDiffs[1024];
static void ReadData()
{
cin >> n >> k;
for (int i = 0; i < n; ++i)
{
cin >> aHeights[i];
}
}
static void InitDiffs()
{
for (int i = 0; i < n - 1; ++i)
{
aDiffs[i] = abs(aHeights[i] - aHeights[i + 1]);
}
}
static inline bool FindBestDiff()
{
bool fFound = false;
for (int i = 0; i < n - 1; ++i)
{
if (aDiffs[i] <= k)
continue;
if (!fFound)
{
fFound = true;
iBestDiffIndex = i;
iBestDiffTop = max(aHeights[i], aHeights[i + 1]);
continue;
}
int iCandidateTop = max(aHeights[i], aHeights[i + 1]);
if (iCandidateTop > iBestDiffTop)
{
iBestDiffTop = iCandidateTop;
iBestDiffIndex = i;
}
}
return fFound;
}
static inline void UpdateDiffLeft(int iPos)
{
if (iPos > 0)
{
iPos--;
aDiffs[iPos] = abs(aHeights[iPos] - aHeights[iPos + 1]);
}
}
static inline void UpdateDiffRight(int iPos)
{
if (iPos < n - 1)
{
aDiffs[iPos] = abs(aHeights[iPos] - aHeights[iPos + 1]);
}
}
static void inline UpdateBestDiff()
{
int iHigherPos = iBestDiffIndex;
int iLowerPos = iBestDiffIndex + 1;
if (aHeights[iLowerPos] > aHeights[iHigherPos])
{
swap(iHigherPos, iLowerPos);
}
int iDiff = aHeights[iHigherPos] - aHeights[iLowerPos];
int iMissing = iDiff - k;
iUsed += iMissing;
aHeights[iLowerPos] += iMissing;
UpdateDiffLeft(iLowerPos);
UpdateDiffRight(iLowerPos);
}
int main()
{
// freopen("sample_input.txt", "r", stdin);
// freopen("sample_output.txt", "w", stdout);
ReadData();
InitDiffs();
iUsed = 0;
while (FindBestDiff())
{
UpdateBestDiff();
}
cout << iUsed;
}
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | #include <iostream> #include <algorithm> #include <utility> using namespace std; static int n, k, iUsed, iBestDiffIndex, iBestDiffTop; static int aHeights[1024]; static int aDiffs[1024]; static void ReadData() { cin >> n >> k; for (int i = 0; i < n; ++i) { cin >> aHeights[i]; } } static void InitDiffs() { for (int i = 0; i < n - 1; ++i) { aDiffs[i] = abs(aHeights[i] - aHeights[i + 1]); } } static inline bool FindBestDiff() { bool fFound = false; for (int i = 0; i < n - 1; ++i) { if (aDiffs[i] <= k) continue; if (!fFound) { fFound = true; iBestDiffIndex = i; iBestDiffTop = max(aHeights[i], aHeights[i + 1]); continue; } int iCandidateTop = max(aHeights[i], aHeights[i + 1]); if (iCandidateTop > iBestDiffTop) { iBestDiffTop = iCandidateTop; iBestDiffIndex = i; } } return fFound; } static inline void UpdateDiffLeft(int iPos) { if (iPos > 0) { iPos--; aDiffs[iPos] = abs(aHeights[iPos] - aHeights[iPos + 1]); } } static inline void UpdateDiffRight(int iPos) { if (iPos < n - 1) { aDiffs[iPos] = abs(aHeights[iPos] - aHeights[iPos + 1]); } } static void inline UpdateBestDiff() { int iHigherPos = iBestDiffIndex; int iLowerPos = iBestDiffIndex + 1; if (aHeights[iLowerPos] > aHeights[iHigherPos]) { swap(iHigherPos, iLowerPos); } int iDiff = aHeights[iHigherPos] - aHeights[iLowerPos]; int iMissing = iDiff - k; iUsed += iMissing; aHeights[iLowerPos] += iMissing; UpdateDiffLeft(iLowerPos); UpdateDiffRight(iLowerPos); } int main() { // freopen("sample_input.txt", "r", stdin); // freopen("sample_output.txt", "w", stdout); ReadData(); InitDiffs(); iUsed = 0; while (FindBestDiff()) { UpdateBestDiff(); } cout << iUsed; } |
English