在 C++ 中删除数组所需的最少操作

c++server side programmingprogramming

描述

给定一个包含 N 个整数的数组,其中 N 为偶数。数组允许两种操作。

  • 将数组中任意元素的值加 1。
  • 如果数组中两个相邻元素是连续素数,则删除这两个元素。

任务是找出删除数组所有元素所需的最少操作次数。

示例

如果数组为 {10, 13},则至少需要 2 次操作

  • 将数组的第一个元素加 1。因此新数组变为 {11, 13
  • 删除第一个和第二个元素,因为它们都是连续素数

算法

1.要删除数字,我们必须将两个数字转换为两个连续的素数。
2. 假设 a 和 b 是连续的素数,然后使用埃拉托斯特尼筛法预先计算素数,然后使用数组找到第一个不大于 a 的素数 p 和第一个大于 p 的素数 p。
3. 完成此计算后,使用动态规划来解决问题。

示例

#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

相关文章