【C++】P1428 小鱼比可爱


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目说明
    • 题目输入格式
    • 题目输出格式
    • 样例
      • **输入样例**
      • **输出样例**
    • 题目解析
  • 💯解法分析
    • 我的做法
      • 代码
      • 解法说明
      • 时间复杂度
    • 老师的做法
      • 代码
      • 解法说明
      • 总结
      • 时间复杂度
  • 💯解法优化
    • 使用树状数组优化
      • 核心思路
      • 实现代码
      • 时间复杂度分析
    • 优化总结
  • 💯小结


在这里插入图片描述


💯前言

  • C++是一门学习成本不高,但深度极大的编程语言,特别适合用于计算机解题和合理化计算程序。在本文中,我不仅对题目 P1428 小鱼比可爱进行详细分析,还将给出全面优化和提升思路,并提供一些解题的扩展思考。此文标题全展,起首展示题目和算法,中段分析并比较不同解法,最后给出一些高效解法应用和态度深选。希望通过本文,让读者不仅能思考优化思路,还能展开观念,学习极致算法应用。
    C++ 参考手册
    在这里插入图片描述

💯题目说明

P1428 小鱼比可爱
在这里插入图片描述

在此题目中,小鱼参加一场“比可爱”比赛。比赛的规则如下:每只小鱼的可爱度以一个整数表示,在自己的视野里,计算自己左边有几只鱼的可爱度比自己低。

题目输入格式

  1. 第一行:一个正整数 n,表示小鱼的数量(最多为 100 只)。
  2. 第二行:一个长度为 n 的正整数列表,为小鱼的可爱度,用空格分隔。

题目输出格式

一行:一个长度为 n 的正整数列表,用空格分隔,表示每只小鱼左边比它可爱度低的鱼的数量。

样例

输入样例

6
4 3 0 5 1 2

输出样例

0 0 0 3 1 2

题目解析

题目要求每只小鱼,计算左边有几只鱼的可爱度比它低。

样例解析如下:

  • 第 1 只小鱼:没有左边的鱼,因此输出 0
  • 第 2 只小鱼:左边为 [4] ,没有可爱度比 3 小的,因此输出 0
  • 第 3 只小鱼:左边为 [4, 3] ,没有可爱度比 0 小的,因此输出 0
  • 第 4 只小鱼:左边为 [4, 3, 0] ,有 3 只鱼可爱度比 5 小,因此输出 3
  • 第 5 只小鱼:左边为 [4, 3, 0, 5] ,有 1 只鱼可爱度比 1 小,因此输出 1
  • 第 6 只小鱼:左边为 [4, 3, 0, 5, 1] ,有 2 只鱼可爱度比 2 小,因此输出 2

上述每个步骤通过一次简单遍历即可解决,但解决总时间复杂度为 n 2 n^2 n2


💯解法分析

我的做法

代码

#include <iostream>
using namespace std;const int N = 100;
int arr[N];int main()
{int n = 0;cin >> n;for(int i = 1; i <= n; i++){cin >> arr[i];}for(int i = 1; i <= n; i++){int count = 0;for(int j = i - 1; j >= 1; j--){if(arr[j] < arr[i])count++;}cout << count << " ";}return 0;
}

在这里插入图片描述

解法说明

  1. 输入

    • 通过 cin 输入小鱼数量和可爱度。
    • 将可爱度保存在数组 arr 中,使用 1-based 下标(从 1 开始)。
  2. 结构解析

    • 外层循环从第 1 只小鱼起,按顺序遍历所有小鱼。
    • 内层循环倒序测量所有左侧鱼,如果比当前小鱼可爱度小,则计数。
  3. 输出

    • 每个小鱼结果通过 cout 输出,用空格分隔。

时间复杂度

  • 外层循环:运行 n 次。
  • 内层循环:对每只小鱼,从左到右最多运行 i-1 次。
  • 总时间复杂度 n 2 n^2 n2

该代码简单直接,能有效解决题目要求,但时间复杂度较高,当小鱼数量较大时效率会较低。


老师的做法

代码

#include <iostream>
using namespace std;const int N = 110;
int arr[N];int main()
{int n = 0;cin >> n;// 输入数据for (int i = 0; i < n; i++){cin >> arr[i];}// 统计for (int i = 0; i < n; i++){int count = 0;for (int j = 0; j < i; j++){if (arr[j] < arr[i]){count++;}}cout << count << " ";}return 0;
}

在这里插入图片描述

解法说明

  1. 输入部分

    • 使用 0-based 数组(从 0 开始),方便与 C++ 数组操作习惯保持一致。
    • 用一个 for 循环输入小鱼可爱度。
  2. 统计部分

    • 外层循环遍历每只小鱼,内层循环遍历当前小鱼左侧的所有小鱼。
    • 内层通过条件判断 arr[j] < arr[i],统计左侧比当前小鱼可爱度低的数量。
  3. 输出部分

    • 每次外层循环完成后,输出当前小鱼的统计结果。

总结

  • 老师的代码与之前代码的逻辑基本一致,但采用了 0-based 数组下标,符合 C++ 常规习惯,代码风格稍微简洁一些。

时间复杂度

  • 同样是 n 2 n^2 n2,适合小规模问题解答。

💯解法优化

使用树状数组优化

为了优化时间复杂度,可以使用**树状数组(Fenwick Tree)**统计比当前小鱼可爱度低的数量,将时间复杂度降为 n l o g ( m a x A ) n log(maxA) nlog(maxA),其中 maxA 为可爱度的最大值。

核心思路

  1. 构建树状数组

    • 树状数组用于动态维护每种可爱度的频率。
    • 初始状态下,所有频率为 0。
  2. 遍历小鱼并更新

    • 对于每只小鱼,查询树状数组中比当前小鱼可爱度低的数量,即为结果。
    • 然后更新当前小鱼的可爱度频率。

实现代码

#include <iostream>
#include <vector>
using namespace std;const int MAX_A = 11; // 最大可爱度是10int fenwick[MAX_A] = {0};// 更新树状数组
void update(int index, int value) {while (index < MAX_A) {fenwick[index] += value;index += index & -index;}
}// 查询前缀和
int query(int index) {int sum = 0;while (index > 0) {sum += fenwick[index];index -= index & -index;}return sum;
}int main() {int n;cin >> n;vector<int> arr(n);for (int i = 0; i < n; i++) {cin >> arr[i];}for (int i = 0; i < n; i++) {// 查询当前小鱼左边比它小的数量cout << query(arr[i]) << " ";// 更新当前小鱼的可爱度update(arr[i] + 1, 1);}return 0;
}

在这里插入图片描述

时间复杂度分析

  • 树状数组更新和查询:每次操作时间复杂度为 l o g ( m a x A ) log(maxA) log(maxA)
  • 总复杂度 n l o g ( m a x A ) n log(maxA) nlog(maxA)

优化总结

树状数组的解法大幅提高了效率,适合数据规模较大的场景,特别是在在线查询和更新问题中应用广泛。


💯小结

本文通过题目 P1428 小鱼比可爱,详细分析了两种基础解法并进行了对比,总结了其时间复杂度和代码风格差异。随后,本文给出了树状数组的优化方案,将时间复杂度从 n 2 n^2 n2 优化为 n l o g ( m a x A ) n log(maxA) nlog(maxA)

该题的核心在于对比和统计,通过基础暴力解法理解问题本质,而通过树状数组等数据结构优化则展示了解题的高效化路径。希望读者能够从中获得启发,学会选择适合的算法解决不同规模的问题。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[coredump] 生成管理

在 Linux 系统中&#xff0c;core dump 文件的生成路径和文件名可以通过几个方面来控制&#xff1a; 系统默认路径&#xff1a; 默认情况下&#xff0c;core dump 文件通常生成在程序的工作目录&#xff0c;即程序运行时的当前目录。文件名通常为 core&#xff0c;或者在某些系…

maven之插件调试

当使用maven进行项目管理的时候&#xff0c;可能会碰到一些疑难问题。网上资料很少&#xff0c;可能会想着直接调试定位问题。这里以maven-compiler-plugin为例&#xff1a; &#xff08;1&#xff09;准备maven-compiler-plugin源码 进入maven 官网-》Maven Plugins-》找到对…

CentOS 8 上搭建SFTP服务

安装 在CentOS 8上搭建SFTP服务&#xff0c;可以通过OpenSSH来实现。以下是具体步骤&#xff1a; 1. 安装OpenSSH服务器 在CentOS 8中&#xff0c;通常已经安装了OpenSSH服务器。如果没有&#xff0c;可以通过以下命令安装&#xff1a; sudo dnf install -y openssh-server…

【系统分析师】- 案例 -数据库特训

目录 1、规范化与逆规范化 2、数据库视图 3、数据库索引 4、SQL优化 5、数据库分区 6、分布式数据库 7、NoSql 8、读写分离&#xff08;主从复制&#xff09; 9、缓存一致性 10、云数据库 11、主题数据库 12、数据同步 1、规范化与逆规范化 规范化&#xff1a; 优点…

Redis(基础篇 + 实践篇 )

01 | 基本架构&#xff1a;一个键值数据库包含什么&#xff1f; Redis 作为一个内存数据存储系统&#xff0c;它的架构设计非常简洁&#xff0c;但功能非常强大。理解其核心架构对高效使用 Redis 至关重要。 客户端与服务器架构&#xff1a; 客户端通过 TCP 协议连接到 Redis …

蓝桥杯(Java)(ing)

Java前置知识 输入流&#xff1a; &#xff08;在Java面向对象编程-CSDN博客里面有提过相关知识------IO流&#xff09; // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new…

GaussDB逻辑解码技术原理深度解析

GaussDB逻辑解码技术原理深度解析 一、背景介绍 在数字化转型的大潮中&#xff0c;异构数据库之间的数据同步需求日益增长。异构数据库同步指的是将不同类型、不同结构的数据库之间的数据进行同步处理&#xff0c;以确保数据在不同数据库之间的一致性。华为云提供的DRS服务&a…

【C++】深入理解C语言中的特殊字符处理与问题分析优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目&#xff1a;B2090 年龄与疾病输入格式输出格式输入输出样例 &#x1f4af;初始代码分析与问题排查问题点分析 &#x1f4af;修正后的代码与优化修正与优化要点 &#…

电商Google广告:2025年提升转化率的5种策略

展望 2025 年&#xff0c;Google 广告领域将迎来一系列显著变化&#xff0c;这些趋势对于提升广告转化率至关重要&#xff0c;值得我们提前关注与布局。 智能化程度持续加深&#xff0c;用户搜索习惯愈发精细&#xff0c;广告格式推陈出新&#xff0c;视频广告势头正猛...那么…

【pytorch练习】使用pytorch神经网络架构拟合余弦曲线

在本篇博客中&#xff0c;我们将通过一个简单的例子&#xff0c;讲解如何使用 PyTorch 实现一个神经网络模型来拟合余弦函数。本文将详细分析每个步骤&#xff0c;从数据准备到模型的训练与评估&#xff0c;帮助大家更好地理解如何使用 PyTorch 进行模型构建和训练。 一、背景 …

设计模式中的代理模式

在Java中&#xff0c;代理模式&#xff08;Proxy Pattern&#xff09;可以通过静态代理和动态代理两种主要方式实现。 一、静态代理模式 在编译时就已经确定了代理类和被代理类的关系。代理类和目标对象通常实现相同的接口或继承相同父类。缺点是对于每个需要代理的目标对象都…

编程入门(2)-2024年 RAD Studio version 12发布综述

随着2024年即将画上句号&#xff0c;我想借此机会回顾一下我们在这一年中发布的一些Embarcadero产品、行业趋势&#xff0c;并感谢我们尊贵的客户们对我们的产品一如既往的支持。这一年对我们来说充满了激动人心的变化和发展&#xff0c;我们非常高兴能与您一起踏上这段旅程。 …

使用LLM自回归与超级转义词表生成图像:超越传统扩散模型的新范式

引言 在人工智能领域&#xff0c;尤其是自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;&#xff0c;大型语言模型&#xff08;LLM&#xff09;的出现带来了前所未有的变革。随着技术的进步&#xff0c;研究人员开始探索如何将LLM应用于更多样…

visual studio 安全模式

一、安全模式&#xff1a; 在 Visual Studio 中&#xff0c;安全模式是一种启动方式&#xff0c;允许你在禁用所有扩展和自定义设置的情况下启动 Visual Studio。这个模式可以帮助排除插件或扩展引起的问题&#xff0c;特别是在 Visual Studio 无法正常启动时。 二、安全模式下…

RocketMQ消费者如何消费消息以及ack

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; https://blog.csdn.net/u013127325/article/details/144934073 2.broker是如何…

现代光学基础5

总结自老师的讲义 yt5 开卷考试复习资料&#xff1a;光探测器与光伏技术 目录 光探测器&#xff08;Photodetector&#xff09; 工作原理二极管电路连接方式响应度&#xff08;Responsivity&#xff09;微弱光检测超导纳米线单光子探测光电二极管噪声 太阳能电池&#xff0…

EasyExcel自定义动态下拉框(附加业务对象转换功能)

全文直接复制粘贴即可&#xff0c;测试无误 一、注解类 1、ExcelSelected.java 设置下拉框 Documented Target({ElementType.FIELD})//用此注解用在属性上。 Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中&#xff0c;jvm加载class文件之后&#xff0c…

【2025最新计算机毕业设计】基于Spring Boot+Vue影院购票系统(高质量源码,提供文档,免费部署到本地)

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

信息科技伦理与道德1:研究方法

1 问题描述 1.1 讨论&#xff1f; 请挑一项信息技术&#xff0c;谈一谈为什么认为他是道德的/不道德的&#xff0c;或者根据使用场景才能判断是否道德。判断的依据是什么&#xff08;自身的道德准则&#xff09;&#xff1f;为什么你觉得你的道德准则是合理的&#xff0c;其他…

解读 C++23 std::expected 函数式写法

文章目录 std::expected 基础概念什么是 std::expected?优势与 std::optional 和 std::variant 的区别 函数式写法的功能和应用1. transform : 对"成功值"进行映射基本用法完全返回不同类型 2 and_then : 对"成功值"进行连续计算3 transform_error : 对&q…