ให้อาร์เรย์ arr และ target หาค่า value ที่เมื่อเปลี่ยนทุกตัวที่ > value ให้ = value ผลรวมจะใกล้ target มากที่สุด (ถ้าเท่ากัน ให้ค่าน้อยสุด)
ตัวอย่าง: [4,9,3], target=10 → 3 (array กลายเป็น [3,3,3] sum=9)
วิธีแก้ปัญหา (Mathematical Derivation)
- avg = target / n
- sum = ผลรวมตัวที่ ≤ avg, cnt = จำนวนตัวที่ ≤ avg
- ถ้า target - sum = 0 → คืน avg
- high = ceil((target - sum) / (n - cnt))
- low = floor((target - sum) / (n - cnt))
- เปรียบเทียบ lowDiff และ highDiff คืนค่าที่ใกล้กว่า (ถ้าเท่ากันให้ low)
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findBestValue(vector<int>& arr, int target) {
int n = arr.size();
int avg = target / n;
int sum = 0, cnt = 0;
for (int i = 0; i < n; i++) {
if (arr[i] <= avg) { sum += arr[i]; cnt++; }
}
if (target - sum == 0) return avg;
int high = ceil(((target - sum) * 1.0) / ((n - cnt) * 1.0));
int low = floor(((target - sum) * 1.0) / ((n - cnt) * 1.0));
int lowDiff = abs(target - (low * (n - cnt) + sum));
int highDiff = abs(target - (high * (n - cnt) + sum));
return (lowDiff <= highDiff) ? low : high;
}
};
int main() {
vector<int> v = {4,9,3,2};
Solution ob;
cout << ob.findBestValue(v, 10);
return 0;
}
Input
[4,9,3,2] 10
Output
3