问题描述
数组A中共有n个元素,初始全为0。你可以对数组进行两种操作:1、将数组中的一个元素加1;2、将数组中所有元素乘2。求将数组A从初始状态变为目标状态B所需要的最少操作数。
输入格式
第一行一个正整数n表示数组中元素的个数
第二行n个正整数表示目标状态B中的元素
输出格式
输出一行表示最少操作数
样例输入
2
7 8
样例输出
7
数据规模和约定
n<=50,B[i]<=1000
解题思路:看到题目第一反应就是套路题bfs做就行,结果成功超时。本题只需要判断存在数不为0就进行while循环,首先先将不是偶数的数减一,然后判断是否都为零这一步一定要写因为这一步可能就结束了。如果有不为零的将数组所有元素除2即可。
代码:
#include<cstdio>
bool not_zero(int a[],int N){
for(int i = 0;i < N;i++){
if(a[i]!=0)
return true;
}
return false;
}
int main(void){
int N;
int a[100];
scanf("%d",&N);
for(int i = 0;i < N;i++){
scanf("%d",&a[i]);
}
int ans = 0;
while(not_zero(a,N)){
for(int i = 0;i < N;i++){
if(a[i]%2!=0){
a[i]--;
ans++;
}
}
if(!not_zero(a,N))
break;
for(int i = 0;i < N;i++){
a[i] /= 2;
}
ans++;
}
printf("%d",ans);
return 0;
}