zoukankan      html  css  js  c++  java
  • 蓝桥杯 change 模拟

    问题描述
      数组A中共有n个元素,初始全为0。你可以对数组进行两种操作:1、将数组中的一个元素加1;2、将数组中所有元素乘2。求将数组A从初始状态变为目标状态B所需要的最少操作数。
    输入格式
      第一行一个正整数n表示数组中元素的个数
      第二行n个正整数表示目标状态B中的元素
    输出格式
      输出一行表示最少操作数
    样例输入
    2
    7 8
    样例输出
    7
    数据规模和约定
      n<=50,B[i]<=1000
    这道题目挺好玩的。

    正解是思考把B数组变为全为0的数组最少需要几步。

    分析下如何把样例7 8 变为 0 0

    先把奇数7减一,操作次数加一,偶数8不动,变为6 8

    6 8都是偶数,都除以2,操作次数加一,变为3 4

    奇数3减一,操作次数加一,变为 2 4

    2 4都是偶数,都除以2,操作次数加一,变为1 2

    奇数1减一,操作次数加一,变为0 2

    0 2都是偶数,都除以2,操作次数加一,变为0 1

    奇数1减一,操作次数加一,变为0 0

    共操作7次

    所以思路就是先遍历一遍B数组,把奇数全部减一,使得B数组全为偶数,然后所有元素都除以2。然后再遍历一遍B数组重复计算。

    之前一直对while(1)这种写法很抵触,现在看来有时候特别方便。
    参考自https://www.cnblogs.com/lusiqi/p/12547532.html
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int a[60];
     4 int main() {
     5     int n;
     6     cin >> n;
     7     for (int i = 1; i <= n; i++) {
     8         cin >> a[i];
     9     }
    10     int ans = 0;
    11     while (1) {
    12         for (int i = 1; i <= n; i++) {
    13             if (a[i] % 2 == 1) {
    14                 ans++;
    15                 a[i]--;
    16             }
    17         } 
    18         int cnt = 0;
    19         for (int i = 1; i <= n; i++) {
    20             if (a[i] == 0) {
    21                 cnt++;
    22             }
    23         }
    24         if (cnt == n) {
    25             break;
    26         }
    27         for (int i = 1; i <= n; i++) {
    28             a[i] /= 2;
    29             
    30         }
    31         ans++;
    32     }
    33     cout << ans << endl;   
    34     return 0;
    35 }
  • 相关阅读:
    GoGin 跨域处理
    Vue sso认证快速接入实践
    领域驱动设计(DDD):项目目录(包、模块)结构
    高绩效团队建设与管理系列课程
    VR设备产业链
    Supercell资深策划谈三大产品制作经验:游戏设计就像丛林探险,必须险中求胜
    领导力管理培训课
    博众投资:虚拟数字人概念,开辟元宇宙炒作新战场!
    FW: Flow区块链门票NFT开发实战【含源码】
    放弃学术研究,做投资大获成功
  • 原文地址:https://www.cnblogs.com/fx1998/p/12716468.html
Copyright © 2011-2022 走看看