蓝桥杯第2117题 砍竹子 c++ 困难 模拟 题解简单秒杀 + 注释

题目

砍竹子 - 蓝桥云课 (lanqiao.cn)

思路和解题方法

  1. #include <iostream> 是包含输入输出流的头文件。
  2. #include <cmath> 是包含数学函数的头文件。

接下来是程序的主要部分:

  1. 定义了一个类型别名 LL,表示 long long 类型。
  2. 声明了数组 a 和 p,用于存储数据。
  3. 在 main 函数中,首先读取输入的整数 n
  4. 使用循环读取 n 个数并存储到数组 a 中。同时,通过计算每个数的平方根(使用了 sqrtl 函数)并统计平方根的次数,将结果存储到数组 p 中,并找出最大的次数 max1
  5. 初始化变量 ans 为0,并在数组 p 的最后添加一个元素0。
  6. 使用两个嵌套的循环,从最大次数 max1 开始递减,依次遍历数组 p 和数组 a
    • 如果当前元素 p[j] 不等于当前次数 i,则跳过本次循环。
    • 如果数组 a 中相邻的两个数相等,则不进行任何操作。
    • 否则,将 ans 加1,将 p[j] 减1,将数组 a 中的元素按照一定的计算方式更新为其平方根。
  7. 打印输出最终的结果 ans

复杂度

        时间复杂度:

                O(n^2)

  1. 外层循环对 n 个元素进行遍历,时间复杂度为 O(n)。
  2. 内层嵌套循环的时间复杂度需要根据具体情况来分析,因为它的时间复杂度依赖于 max1 的值和数组中元素的分布情况。

时间复杂度介于 O(n) 和 O(n^2) 之间,具体取决于 max1 的值和数组中元素的分布情况。

        空间复杂度

                O(n)

        空间复杂度,主要是由数组 a、p 和临时变量 t 所占用的空间,因此空间复杂度为 O(n)。

c++ 代码

#include <iostream>
#include <cmath>

using namespace std;

typedef long long LL; // 定义 long long 类型的别名 LL
LL a[200010]; // 定义长整型数组 a,大小为 200010
int p[200010]; // 定义整型数组 p,大小为 200010

int main()
{
  int n ; // 声明整数变量 n
  scanf("%d",&n); // 读取输入的整数 n

  int max1 = 0; // 声明并初始化 max1 为 0
  for(int i = 0 ;i< n ;i++) // 循环读入 n 个数
  {
      scanf("%lld",&a[i]); // 读取长整型数并存入数组 a
      LL t = a[i]; // 将 a[i] 赋值给临时变量 t
      while(t!=1){ // 当 t 不等于 1 时进行循环
          p[i]++; // 对应位置的 p 值加 1
          t = sqrtl((t/2)+1); // 计算 t 的平方根并赋值给 t
      }
      max1 = max(p[i],max1); // 更新 max1 为 p[i] 和 max1 中的较大值
  }

  int ans = 0; // 声明并初始化 ans 为 0
  p[n] = 0; // 将 p[n] 设置为 0
  for(int i = max1;i>0;i--) // 从 max1 到 1 进行循环
  {
      for(int j = 0;j<n;j++) // 遍历数组 p
      {
          if(p[j]!=i) continue; // 如果 p[j] 不等于 i,跳过本次循环
          if(a[j]==a[j+1]); // 如果 a[j] 等于 a[j+1],什么也不做
          else ans++; // 否则,ans 加 1
          p[j]--; // p[j] 减 1
          a[j] = sqrtl((a[j]/2)+1); // 计算 a[j] 的平方根并赋值给 a[j]
      }
  }

  cout<<ans<<endl; // 输出 ans
  return 0;
}

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值