สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มที่เรียกว่า nums และจำนวนเต็ม k นั่นคือค่าขีดจำกัด เราจะเลือกตัวหารจำนวนเต็มบวกและหารอาร์เรย์ทั้งหมดตามค่านั้นแล้วรวมผลลัพธ์ของการหาร เราต้องหาตัวหารที่เล็กที่สุดเพื่อให้ผลลัพธ์ที่กล่าวถึงข้างต้นน้อยกว่าหรือเท่ากับค่าขีดจำกัด k ตัวอย่างเช่น − ถ้า nums =[1,2,5,9] และ k =6 ผลลัพธ์จะเป็น 5 เราจะได้ผลรวมเป็น (1+2+5+9) =17 เมื่อตัวหารเป็น 1 หากตัวหารเป็น 4 เราก็จะได้ผลรวม 7 เป็น (1+1+2+3) เมื่อตัวหารเป็น 5 ผลรวมจะเป็น (1+1+1+2) =5
รับรองว่าจะมีคำตอบ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดวิธีหนึ่งที่เรียกว่า ตรวจสอบ ซึ่งจะใช้พารามิเตอร์สามตัว เช่น x, array nums และ k ซึ่งจะเป็นดังนี้ −
- ผลรวม :=0
- สำหรับ i ในช่วง 0 ถึงขนาดของ nums – 1
- sum :=sum + ค่าเพดานของ nums[i] / x
- คืนค่า จริง ถ้าผลรวม <=k มิฉะนั้น เท็จ
- วิธีการจริงจะเป็นดังนี้ -
- ตั้งค่าต่ำ :=1 และสูง :=inf
- ในขณะที่ต่ำ <สูง
- กลาง :=ต่ำ + (สูง – ต่ำ)/2
- ถ้าตรวจสอบ (mid, nums, k) แล้ว high :=mid หรือ low :=mid + 1
- ผลตอบแทนสูง
- ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น −
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool ok(int x, vector <int> &nums, int th){
int sum = 0;
for(int i = 0; i < nums.size(); i++){
sum += ceil((double)nums[i]/(double)x);
}
return sum<=th;
}
int smallestDivisor(vector<int>& nums, int th) {
int low = 1;
int high = 1e7;
while(low < high){
int mid = low + (high - low)/2;
if(ok(mid, nums, th)){
high = mid;
}else low = mid + 1;
}
return high;
}
};
main(){
vector<int> v = {1,2,5,9};
Solution ob;
cout << (ob.smallestDivisor(v, 6));
} อินพุต
[1,2,5,9] 6
ผลลัพธ์
5