枚举+二分 转变数组猴和目标值的差的绝对值的数组应该是一个先递减再递增最后不变的一个数组 根据单调性来二分 如果当前枚举的value求出来的距离是单调递减的话 那么左边的舍去 否则右边的舍去 代码如下
int sum(vector<int>&arr, int val)
{
int ret = 0;
int n = arr.size();
for (int i = 0; i < n; i++)
{
ret += min(val, arr[i]);
}
return ret;
}
int findBestValue(vector<int>& arr, int target) {
int left = 0, right = 100005, mid, sum_mid_1, sum_mid;
while (left < right)
{
mid = (left + right) >> 1;
sum_mid_1 = sum(arr, mid + 1);
sum_mid = sum(arr, mid);
if (abs(sum_mid_1-target)-abs(sum_mid-target)<0)//单调递减 左边的舍掉
{
left = mid + 1;
mid++;
}
else
{
right = mid;
}
}
if (abs(sum(arr, mid) - target) == abs(sum(arr, mid - 1) - target)) return mid - 1;
return mid;
}