问题描述 :
数组A中共有n个元素,初始全为0。你可以对数组进行两种操作:1、将数组中的一个元素加1;2、将数组中所有元素乘2。求将数组A从初始状态变为目标状态B所需要的最少操作数。
输入说明 :
第一行一个正整数n表示数组中元素的个数
第二行n个正整数表示目标状态B中的元素
n<=50,B[i]<=1000
输出说明 :
输出一行表示最少操作数
输入范例 :
2
7 8
输出范例 :
7
完整C++代码
逆向思维
#include <bits/stdc++.h>
using namespace std;
int n;
int num[60];
int main()
{
// 读取数据
cin >> n;
for (int i = 0; i < n; i++) {
cin >> num[i];
}
// 直接逆推,每个奇数都减1变成偶数,然后偶数全部除2
int cnt = 0;
while (true) {
bool finish = true;
for (int i = 0; i < n; i++) {
// 奇数
if (num[i] % 2) {
cnt++;
num[i]--;
}
if (num[i]) finish = false;
}
if (finish) break;
// 偶数
for (int i = 0; i < n; i++) {
num[i] /= 2;
}
cnt++;
}
cout << cnt << endl;
return 0;
}
😋欢迎大伙私信或者评论区交流讨论😋