蓝桥杯 算法提高 change

资源限制

时间限制:1.0s   内存限制:256.0MB
问题描述
  数组A中共有n个元素,初始全为0。你可以对数组进行两种操作:1、将数组中的一个元素加1;2、将数组中所有元素乘2。求将数组A从初始状态变为目标状态B所需要的最少操作数。
输入格式
  第一行一个正整数n表示数组中元素的个数

  第二行n个正整数表示目标状态B中的元素
输出格式
  输出一行表示最少操作数
样例输入
2

7 8
样例输出
7
数据规模和约定
  n<=50,B[i]<=1000
 
总结:
逆向思维,把题目转化为b数组经过变化之后变成a数组
 
代码:
#include<iostream>
#include<stdio.h>
using namespace std;
int b[51];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%d",&b[i]);
    int ans=0;
    while(1){
        for(int i=1;i<=n;i++){
            if(b[i]%2){
                ans++;
                b[i]--;
            }
        } 
        int cnt = 0;
        for(int i=1;i<=n;i++){
            if(b[i]==0)
                cnt++;
        }
        if(cnt==n)
            break;
        for(int i=1;i<=n;i++){
            b[i]/=2;
            
        }
        ans++;
    }
    cout<<ans<<endl;   
    return 0;
}

 

posted @ 2020-03-22 18:27  sqsq  阅读(268)  评论(0编辑  收藏  举报