คำอธิบายโจทย์
เริ่มจากอาร์เรย์ A ที่ทุกค่าเป็น 1 ทำซ้ำ: หาผลรวม x ของทุกค่าใน A, เลือก index i แล้วตั้ง A[i] = x ถามว่าสามารถสร้าง target array ได้หรือไม่
ตัวอย่าง
target = [3,9,5] → True
ขั้นตอน: [1,1,1] sum=3 → [3,1,1] sum=5 → [3,1,5] sum=9 → [3,9,5]
วิธีแก้ปัญหา (ย้อนกลับ)
- คำนวณผลรวมทั้งหมดของ target
- ใช้ Max Heap (priority queue) เก็บค่าทุกตัว
- วนลูปเมื่อค่าสูงสุด > ผลรวมของที่เหลือ:
- นำค่าสูงสุด x ออก
- คำนวณค่าเดิม: 2*x - sum
- นำค่าเดิมกลับเข้า heap
- อัปเดต sum = x
- ถ้า sum สุดท้าย == n (ขนาดอาร์เรย์) → True, มิฉะนั้น False
การทำงานของโค้ด
#include <bits/stdc++.h>
using namespace std;
typedef long long lli;
class Solution {
public:
bool isPossible(vector<int>& target) {
lli sum = 0;
int n = target.size();
for(int x : target) sum += x;
priority_queue<int> pq(target.begin(), target.end());
while(pq.top() * 2 > sum) {
int x = pq.top(); pq.pop();
pq.push(2 * x - sum);
sum = x;
}
return sum == n;
}
};
int main() {
Solution ob;
vector<int> v = {3,9,5};
cout << ob.isPossible(v); // 1 = true
return 0;
}
อินพุต
{3,9,5}
เอาต์พุต
1