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

การดำเนินการน้อยที่สุดที่ต้องการเพื่อลบอาเรย์ใน C++

คำอธิบาย

กำหนดอาเรย์ของ N จำนวนเต็ม โดย N เป็นเลขคู่ มีสองประเภทของการดำเนินการที่อนุญาตบนอาเรย์

  • เพิ่มค่าขององค์ประกอบใดๆ ในอาเรย์ขึ้น 1
  • ถ้าสององค์ประกอบที่อยู่ติดกันในอาเรย์เป็นจำนวนเฉพาะที่ติดกัน ให้ลบทั้งสององค์ประกอบนั้น

งานคือหาจำนวนการดำเนินการน้อยที่สุดที่จำเป็นเพื่อลบองค์ประกอบทั้งหมดของอาเรย์

ตัวอย่าง

ถ้าอาเรย์คือ {10, 13} แล้วต้องการการดำเนินการขั้นต่ำ 2 ครั้ง

  • เพิ่มองค์ประกอบที่ 1 ของอาเรย์ขึ้น 1 สตริงใหม่กลายเป็น {11, 13}
  • ลบองค์ประกอบที่ 1 และ 2 เพราะทั้งคู่เป็นจำนวนเฉพาะที่ติดกัน

อัลกอริทึม

1. เพื่อลบตัวเลข เราต้องแปลงสองตัวเลขให้เป็นจำนวนเฉพาะที่ติดกัน
2. สมมติ a และ b เป็นจำนวนเฉพาะที่ติดกัน เราใช้ sieve of Eratosthenes เพื่อคำนวณจำนวนเฉพาะล่วงหน้า แล้วหาจำนวนเฉพาะ p แรกที่ไม่มากกว่า a และจำนวนเฉพาะแรกที่มากกว่า p โดยใช้อาเรย์
3. เมื่อการคำนวณนี้เสร็จ ใช้ dynamic programming เพื่อแก้ปัญหา

ตัวอย่างโค้ด C++

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int minimumPrefixReversals(int *a, int n) {
  string start = "";
  string destination = "", t, r;
  for (int i = 0; i < n; i++) {
    start += to_string(a[i]);
  }
  sort(a, a + n);
  for (int i = 0; i < n; i++) {
    destination += to_string(a[i]);
  }
  queue<pair<string, int> > qu;
  pair<string, int> p;
  qu.push(make_pair(start, 0));
  if (start == destination) {
    return 0;
  }
  while (!qu.empty()) {
    p = qu.front();
    t = p.first;
    qu.pop();
    for (int j = 2; j <= n; j++) {
      r = t;
      reverse(r.begin(), r.begin() + j);
      if (r == destination) {
        return p.second + 1;
      }
      qu.push(make_pair(r, p.second + 1));
    }
  }
}
int main() {
  int a[] = { 1, 2, 4, 3 };
  int n = sizeof(a) / sizeof(a[0]);
  cout << "Minimum reversal: " << minimumPrefixReversals(a, n) << endl;
  return 0;
}

เมื่อคุณคอมไพล์และรันโปรแกรมด้านบน จะได้ผลลัพธ์ดังนี้:

ผลลัพธ์

Minimum reversal: 3