问题描述
数组A中共有n个元素,初始全为0。你可以对数组进行两种操作:1、将数组中的一个元素加1;2、将数组中所有元素乘2。求将数组A从初始状态变为目标状态B所需要的最少操作数。
输入格式
第一行一个正整数n表示数组中元素的个数
第二行n个正整数表示目标状态B中的元素
输出格式
输出一行表示最少操作数
样例输入
2
7 8
样例输出
7
数据规模和约定
n<=50,B[i]<=1000
我的思路:遍历每一个数,如果是奇数则减1,次数++,如果全是偶数,则全部除以2,次数++
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; ++i) {
arr[i] = sc.nextInt();
}
sc.close();
System.out.println(f(arr, 0) - 1);
}
public static int f(int[] arr, int count) {
boolean flag = true;
for (int i = 0; i < arr.length; ++i) {
if (arr[i] != 0) {
flag = false;
break;
}
}
if (flag) {
return count;
} else {
for (int i = 0; i < arr.length; ++i) {
if (arr[i] % 2 == 1) {
arr[i] = arr[i] - 1;
count++;
}
}
// for (int i = 0; i < arr.length; ++i) {
// System.out.print(arr[i] + " ");
// }
// System.out.println();
for (int i = 0; i < arr.length; ++i) {
if (arr[i] != 0) {
flag = false;
break;
}
}
if (flag) {
return count;
} else {
for (int i = 0; i < arr.length; ++i) {
arr[i] = arr[i] / 2;
// System.out.print(arr[i] + " ");
}
count++;
// System.out.println();
}
return f(arr, count);
}
}
}