diff --git a/problems/cpp/maximum-value-at-a-given-index-in-a-bounded-array.cpp b/problems/cpp/maximum-value-at-a-given-index-in-a-bounded-array.cpp new file mode 100644 index 0000000..f2c4cda --- /dev/null +++ b/problems/cpp/maximum-value-at-a-given-index-in-a-bounded-array.cpp @@ -0,0 +1,54 @@ +#include + +namespace { +long sum(long index, long value, long n) +{ + long count = 0; + + if (value > index) { + count += (2 * value - index) * (index + 1) / 2; + } else { + count += (value + 1) * value / 2 + index - value + 1; + } + + if (value >= n - index) { + count += (2 * value - n + 1 + index) * (n - index) / 2; + } else { + count += (value + 1) * value / 2 + n - index - value; + } + + return count - value; +} +} + +class Solution { +public: + int maxValue(int n, int index, int maxSum) + { + int left = 1, right = maxSum; + + while (left < right) { + int mid = (left + right + 1) / 2; + if (sum(index, mid, n) <= maxSum) { + left = mid; + } else { + right = mid - 1; + } + } + + return left; + } +}; + +int main() +{ + Solution s; + + assert(s.maxValue(4, 2, 6) == 2); + assert(s.maxValue(6, 1, 10) == 3); + + // regression + assert(s.maxValue(6, 2, 931384943) == 155230825); + + return 0; +}