计算在 C++ 中获得给定所需数组的最小步骤

我们得到了一个数组 target[],其中包含数字。我们必须找到可以仅使用以下两个操作将全零数组 [0,0,0,0...] 转换为目标的最小步骤 -

  • 递增操作 - 所有元素都可以递增 1,每个递增操作都可以分步单独计数。(对于 n 个元素中的 n 个增量 step=n )

  • 加倍操作 - 整个数组加倍。对于所有元素,它被计算一次。(每个加倍操作将所有元素的值加倍,按步数计为 1

目标是找到达到目标的最少步数。例如 [0,0,0] 可以通过最少 3 步(通过对所有元素的增量操作)变为 [1,1,1] 并且可以通过再一次加倍操作变为 [2,2,2],这次总共需要 4 步(3 次递增,1 次加倍)。

输入

target[]= { 1,2,2,3 }
输出结果
Minimum steps to reach target from {0,0,0,0} : 6

解释

最初我们有 { 0,0,0,0 }

3 增量操作 { 0,1,1,1 } //增量单独发生

1 加倍操作 { 0,2,2,2 } // 加倍发生在所有元素上

2 递增操作 { 1,2,2,3 }

总步数= 3+1+2=6

输入

target[]= { 3,3,3 }
输出结果
Minimum steps to reach target from {0,0,0} : 7

解释

最初我们有 { 0,0,0 }

3 增量操作 { 1,1,1 } //增量单独发生

1 加倍操作 { 2,2,2 } // 加倍发生在所有元素上

3 递增操作 { 3,3,3 }

总步数= 3+1+3=7

下面程序中使用的方法如下

  • 整数数组 target[] 存储要到达的目标元素。

  • 函数 minSteps(int target[],int n) 将目标数组及其长度 'n' 作为输入,并返回从所有零到达目标的最小步数。

  • 变量计数用于存储步数,最初为 0。

  • 变量 max 用于存储最高元素,最初为 target[0]。

  • 变量 pos 用于存储 max found 的索引,最初为 0。

  • 如果 target[] 数组全为零,则返回 0,因为不需要步骤。( for (i=0;i<n;i++) if (target[i]==0) count++; if(count==n)//全零)

  • 现在在这种方法中,我们将从 target[] 到达所有零。

  • 通过从奇数中减去 1 使所有元素偶数。每次减法的递增计数(与递增操作相同)

  • 现在我们都有偶数了。

  • 还要在同一个循环中找到最大值及其位置,并初始化 max 和 pos。

  • 现在我们开始将整个数组除以 2,直到最大值不再为 1。如果有任何数字变为奇数,则减 1 并增加计数,对于整个除法运算,计数会增加一次。

  • 最后,所有元素都将是 0 或 1,因为所有 1 使它们成为 0 并再次增加计数。

  • 将结果作为计数中存在的步数返回。

示例

#include <bits/stdc++.h>
using namespace std;
int minSteps(int target[],int n){
   int i;
   int count=0;
   int max=target[0];
   int pos=0;
   for(i=0;i<n;i++)
      if(target[i]==0)
         count++;
      //如果全部为零,则与目标相同
      if(count==n)
         return 0;
         count=0;
         //通过sbtracting 1使所有
      for(i=0;i<n;i++){
         if(target[i]%2==1){
            target[i]=target[i]-1;
            count++;
      }
      //找到最大值及其位置
      if(target[i]>=max){
         max=target[i];
         pos=i;
      }
   }
   //减 2 直到所有元素都为 1 并增加一次计数
   while(target[pos]!=1){
      for(i=0;i<n;i++){
         if(target[i]%2==1){
             target[i]=target[i]-1;
            count++;
      }
      target[i]=target[i]/2;
   }
   count++;
}
//整个数组是 {1} 清零并增加计数
while(target[pos]!=0){
   for(i=0;i<n;i++){
      if(target[i]!=0){
         target[i]=target[i]-1;
         count++;}
      }
   }
   return count;
}
int main(){
   int target[]={15,15,15};
   cout<<"\nMinimum steps to get the given desired array:"<<minSteps(target,3);
   return 0;
}
输出结果
Minimum steps to get the given desired array:15