我们得到了一个数组 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