43 最少操作数
作者: Turbo时间限制: 1S章节: 基本练习(数组)
问题描述 :
数组A中共有n个元素,初始全为0。你可以对数组进行两种操作:1、将数组中的一个元素加1;2、将数组中所有元素乘2。求将数组A从初始状态变为目标状态B所需要的最少操作数。
输入说明 :
第一行一个正整数n表示数组中元素的个数
第二行n个正整数表示目标状态B中的元素
n<=50,B[i]<=1000
输出说明 :
输出一行表示最少操作数
输入范例 :
2
7 8
输出范例 :
7
解决思路:
1.逆推思想
2.求最少操作数(奇数与偶数分开求解)
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int number[n];
int s[n];
int i;
for(i=0;i<n;i++)
scanf("%d",&number[i]);
int count=0;
while(1){
int flag=0;
for(i=0;i<n;i++){
if(number[i]%2!=0){//奇数处理
count++;
number[i]--;
}
if(number[i]!=0)
flag=1;
}
if(flag==0)
break;//全部算完了
for(i=0;i<n;i++)
number[i]=number[i]/2;//偶数统一除以2
count++;
}
printf("%d\n",count);
return 0;
}