Problem
Given an integer range, for all M
in that inclusive range, determine the minimum: abs(arr[i]-M)
, for all 1 <= i <= size[a]
Once that has been determined for all integers in the range, return the M
which generated the maximum of those values. If there are multiple M's
that result in that value, return the lowest one.
Input
The first line contains an integer n, the number of elements in a.
The next line contains n space-separated integers a[i].
The third line contains two space-separated integers p and q, the inclusive endpoints for the range of M.
Output
Print the value of M on a line.
Constraints
- 1 <= n <= 102
- 1 <= a[i] <= 109
- 1 <= p <= q < 109
Sample Input
3 5 8 14 4 9
Sample Output
4
Solution
Approach: Sort the input array a. After that the required M could either be p, q or lie between the array elements. If a1 and a2 are array elements such that a1 < a2, then possible m could be:
Code Implementation
//
// main.cpp
// Sherlock and MiniMax
//
// Created by Himanshu on 26/03/22.
//
#include <vector>
#include <iostream>
#include <algorithm>
#define MAX_NUM 1000000000
using namespace std;
typedef long long ll;
ll diff, ans = MAX_NUM;
void solve (vector<ll> arr, int n, ll m, ll p, ll q) {
if (m>=p && m<=q) {
ll tempDiff = MAX_NUM;
for(int i=0; i<n; i++) {
tempDiff = min(tempDiff, abs(arr[i]-m));
}
if(tempDiff > diff || (tempDiff==diff && m<ans)){
diff = tempDiff;
ans = m;
}
}
}
int main() {
int n;
ll p, q;
cin>>n;
vector<ll> arr(n);
for (int i=0; i<n; i++) {
cin>>arr[i];
}
cin>>p>>q;
sort(arr.begin(), arr.end());
solve(arr, n, p, p, q);
solve(arr, n, q, p, q);
for (int i=1; i<n; i++) {
solve(arr, n, (arr[i] + arr[i-1])/2, p, q);
}
cout<<ans<<endl;
return 0;
}
Time complexity: O(n2), where n is the size of input array
Reference:
YouTube Channel – Algods