Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การเพิ่มองค์ประกอบของอาร์เรย์จนกว่าทุกองค์ประกอบจะมากกว่าหรือเท่ากับ k ใน C++


อาร์เรย์ − อาร์เรย์คือคอนเทนเนอร์ของอิลิเมนต์ที่มีประเภทข้อมูลเดียวกัน ซึ่งอิลิเมนต์จะถูกจัดทำดัชนีเป็น 0

ในปัญหานี้ เราจะใช้อาร์เรย์ของจำนวนเต็ม และตรวจสอบว่าองค์ประกอบทั้งหมดมากกว่าจำนวนที่กำหนดหรือไม่ ที่นี่เราจะตรวจสอบว่าองค์ประกอบทั้งหมดของอาร์เรย์มากกว่าหรือเท่ากับจำนวนที่กำหนด k หรือไม่ ถ้าไม่เช่นนั้น เราจะเพิ่มองค์ประกอบขั้นต่ำสองรายการของอาร์เรย์และถือว่าผลรวมนี้เป็นองค์ประกอบเดียว จากนั้นตรวจสอบเงื่อนไขเดียวกันอีกครั้งสำหรับอาร์เรย์ใหม่ หากเงื่อนไขเป็นจริง จำนวนครั้งที่ดำเนินการรวมจะถูกส่งคืน

Array = { 2, 6,3,12, 7} K = 5
Output : 1

คำอธิบาย − ก่อนอื่นเราจะตรวจสอบว่าองค์ประกอบทั้งหมดมากกว่าหรือ k หรือไม่ เนื่องจากไม่ใช่ เราจะเพิ่มตัวเลขขั้นต่ำสองตัว ซึ่งก็คือ 2 และ 3 ดังนั้นองค์ประกอบแรกในอาร์เรย์ใหม่ของเราจะเป็น 5 ตอนนี้ เราจะตรวจสอบอีกครั้ง คราวนี้เป็นไปตามเงื่อนไข ดังนั้นเราจะส่งคืนหมายเลข ของการเพิ่มเติมที่เราทำ

อัลกอริทึม

ป้อนข้อมูล − Array และ K

Step 1 : check if all elements are greater than or equal to K
Step 2: if(yes){
   Print number of iterations.
}
exit(0)
Step 3: else {
   Add smallest two elements of the array and make it one element.
}
Step 4: goto step 1

ตัวอย่าง

#include<bits/stdc++.h>
using namespace std;
class MinHeap{
   int *harr;
   int capacity;
   int heap_size;
   public:
   MinHeap(int *arr, int capacity);
   void heapify(int );
   int parent(int i){
      return (i-1)/2;
   }
   int left(int i){
      return (2*i + 1);
   }
   int right(int i){
      return (2*i + 2);
   }
   int extractMin();
   int getMin(){
      return harr[0];
   }
   int getSize(){
      return heap_size;
   }
   void insertKey(int k);
};
MinHeap::MinHeap(int arr[], int n){
   heap_size = n;
   capacity = n;
      harr = new int[n];
   for (int i=0; i<n; i++)
      harr[i] = arr[i];
   for (int i=n/2-1; i>=0; i--)
      heapify(i);
}
void MinHeap::insertKey(int k){
   heap_size++;
   int i = heap_size - 1;
   harr[i] = k;
   while (i != 0 && harr[parent(i)] > harr[i]){
      swap(harr[i], harr[parent(i)]);
      i = parent(i);
   }
}
int MinHeap::extractMin(){
   if (heap_size <= 0)
      return INT_MAX;
   if (heap_size == 1){
      heap_size--;
      return harr[0];
   }
   int root = harr[0];
   harr[0] = harr[heap_size-1];
   heap_size--;
   heapify(0);
   return root;
}
void MinHeap::heapify(int i){
   int l = left(i);
   int r = right(i);
   int smallest = i;
   if (l < heap_size && harr[l] < harr[i])
      smallest = l;
   if (r < heap_size && harr[r] < harr[smallest])
      smallest = r;
   if (smallest != i){
      swap(harr[i], harr[smallest]);
      heapify(smallest);
   }
}
int main(){
   int arr[] = { 2, 6,3,12, 7};
   int n = sizeof(arr)/sizeof(arr[0]);
   int k = 5;
   MinHeap h(arr, n);
   long int res = 0;
   while (h.getMin() < k){
      if (h.getSize() == 1)
         return -1;
      int first = h.extractMin();
      int second = h.extractMin();
      h.insertKey(first + second);
      res++;
   }
   cout << res;
   return 0;
}

ผลลัพธ์

1