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

เพิ่มขนาดของอาร์เรย์ให้ใหญ่สุดโดยลบ k อาร์เรย์ย่อยทั้งหมดเพื่อสร้างอาร์เรย์ไพรม์ใน C++


ภารกิจคือการลบ K อาร์เรย์ย่อยออกจากอาร์เรย์ที่กำหนด Arr[] ที่มีองค์ประกอบบวก N เพื่อให้องค์ประกอบที่เหลือทั้งหมดในอาร์เรย์เป็นจำนวนเฉพาะและขนาดของอาร์เรย์ที่เหลือสูงสุด

ป้อนข้อมูล

Arr[]={4, 3, 3, 4, 3, 4, 3} , K=2

ผลผลิต

3

คำอธิบาย − K=2 หมายถึงต้องลบเพียง 2 อาร์เรย์ย่อย

อาร์เรย์ย่อยที่ถูกลบคือ Arr[0] และ Arr[3…5] ซึ่งปล่อยให้อาร์เรย์ Arr[]={3,3,3} มีองค์ประกอบหลักทั้งหมดและขนาดสูงสุดที่เป็นไปได้

ป้อนข้อมูล

Arr[]={7, 6, 2, 11, 8, 3, 12}, K=2

ผลผลิต

3

คำอธิบาย − อาร์เรย์ย่อยที่ถูกลบคือ Arr[1] และ Arr[4…6] และอาร์เรย์หลักที่เหลือคือ Arr[]={7,2,11}

แนวทางที่ใช้ในโปรแกรมด้านล่างดังนี้

  • ขั้นแรกให้เก็บไพรม์ทั้งหมดไว้ในอาร์เรย์ไพรม์อื่น[] โดยใช้ตะแกรงของ Eratosthenes โดยเรียกใช้ฟังก์ชัน sieve()

  • ในฟังก์ชัน MaxSize() เรียกใช้การวนซ้ำจาก i=0 จนถึง i

  • จากนั้นรันลูปอื่นจาก i=1 จนถึง i

  • จากนั้นจัดเรียงเวกเตอร์ diff โดยใช้ฟังก์ชัน sort()

  • ตอนนี้ให้รันลูปอื่นจาก i=1 ถึง i

  • การใช้คำสั่ง if ตรวจสอบกรณีที่เป็นไปไม่ได้ นั่นคือเมื่อ K=0 และไม่มีส่วนประกอบใดๆ

  • หาก K มากกว่าหรือเท่ากับจำนวนคอมโพสิต ให้ลบคอมโพสิตทั้งหมดรวมถึงจำนวนเฉพาะพิเศษ และขนาดของอาร์เรย์ย่อยเหล่านี้ที่จะลบควรเป็น 1 เพื่อให้ได้คำตอบที่ดีที่สุด

  • หาก K น้อยกว่าจำนวนคอมโพสิต เราจะต้องลบอาร์เรย์ย่อยที่มีคอมโพสิตและอาร์เรย์ย่อยหลักไม่ควรอยู่ในหมวดหมู่นี้

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
const int Num = 1e5;
bool prime[Num];
//Sieve of Eratosthenes
void sieve(){
   for (int i = 2; i < Num; i++) {
      if (!prime[i]){
         for (int j = i + i; j < Num; j += i){
            prime[j] = 1;
         }
      }
   }
   prime[1] = 1;
}
int MaxSize(int* arr, int N, int K){
   vector<int> vect, diff;
   //Inserting the indices of composite numbers
   for (int i = 0; i < N; i++){
      if (prime[arr[i]])
         vect.push_back(i);
   }
   /*Computing the number of prime numbers between
   two consecutive composite numbers*/
   for (int i = 1; i < vect.size(); i++){
      diff.push_back(vect[i] - vect[i - 1] - 1);
   }
   //Sorting the diff vector
   sort(diff.begin(), diff.end());
   //Computing the prefix sum of diff vector
   for (int i = 1; i < diff.size(); i++){
      diff[i] += diff[i - 1];
   }
   //Impossible case
   if (K > N || (K == 0 && vect.size())){
      return -1;
   }
   //Deleting sub-arrays of length 1
   else if (vect.size() <= K){
      return (N - K);
   }
   /*Finding the number of primes to be deleted
   when deleting the sub-arrays*/
   else if (vect.size() > K){
      int tt = vect.size() - K;
      int sum = 0;
      sum += diff[tt - 1];
      int res = N - (vect.size() + sum);
      return res;
   }
}
//Main function
int main(){
   sieve();
   int arr[] = { 7, 2, 3, 4, 3, 6, 3, 3 };
   int N = sizeof(arr) / sizeof(arr[0]);
   int K = 2;
   cout<< MaxSize(arr, N, K);
   return 0;
}

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น เราจะได้ผลลัพธ์ดังต่อไปนี้ -

6