【C++】B2066救援题目分析和解决讲解


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯 题目
  • 💯 题目分析
    • 每个屋顶计算的元素
  • 💯 思路解析
    • 1. **读取输入**
    • 2. **计算屋顶时间**
    • 3. **结果精确取整**
  • 💯 完整解决代码
  • 💯 突出问题分析
    • 1. **选择正确的数据类型**
      • 解决方案
    • 2. **取整的位置**
      • 优化思路
    • 3. **边界情况处理**
  • 💯 复杂度分析
    • 1. **时间复杂度**
    • 2. **空间复杂度**
  • 💯 学习收获和应用
  • 💯 小结


在这里插入图片描述


💯前言

  • 在本文中,我们将对一道来自洛谷编程题目“B2066 救援”进行全面分析和解决,包括题目内容释义,解决思路,以及代码运行中的更新与优化过程。对于解题过程中出现的问题,我们进行了不同方案比较,并给出了细致的解析和解决方式。通过本文,读者将能学习如何分析一道复合题,如何检查代码中的问题,以及如何使解决方案更加精准和高效。
    以下是我们对题目《B2066 救援》的分析和全过程解决。
    C++ 参考手册
    在这里插入图片描述

💯 题目

B2066 救援
在这里插入图片描述

救援

题目描述

救生船从大本营出发,营救若干屋顶上的人回到大本营,屋顶数目以及每个屋顶的坐标。

和人数都将由输入决定,求出所有人都到达大本营并登陆所用的时间。

在直角坐标系的原点是大本营,救生船每次从大本营出发,救了人之后将人送回大本营。坐标系中的点代表屋顶,每个屋顶由其位置坐标和其上的人数表示。救生船每次从大本营出发,以速度 50 50 50 米 / 分钟驾向下一屋顶,达到一屋顶后,救下其上的所有人,每人上船 1 1 1 分钟,船原路返回,达到大本营,每人下船 0.5 0.5 0.5 分钟。假设原点与任意一个屋顶的连线不突过其它屋顶。

输入格式

第一行,一个整数,表示屋顶数 n n n

接下来会有 n n n 行输入,每一行上包含两个表示屋顶相对于大本营的平面坐标位置的实数(单位是米)、一个表示人数的整数,数之间以一个空格分开。

输出格式

一行,救援需要的总时间,精确到分钟(向上取整)。

样例 #1

样例输入 #1

1
30 40 3

样例输出 #1

7

💯 题目分析

该题目基本问题背景是:在直角坐标系中,大本营作为原点,救生船需要去回不同屋顶,将上面的人救回大本营,每个屋顶的坐标和人数由输入确定。救援时间由下列团队操作减反处理:

每个屋顶计算的元素

  1. 每个屋顶和大本营的相实坐标跑,在平面坐标系中远离:
    Distance = x 2 + y 2 \text{Distance} = \sqrt{x^2 + y^2} Distance=x2+y2

  2. 进出和退场时间:
    Travel Time (Round Trip) = 2 ⋅ Distance 50 \text{Travel Time (Round Trip)} = 2 \cdot \frac{\text{Distance}}{50} Travel Time (Round Trip)=250Distance

  3. 每个人上船和下船的时间:
    Load Time = People ⋅ ( 1 + 0.5 ) = People ⋅ 1.5 \text{Load Time} = \text{People} \cdot (1 + 0.5) = \text{People} \cdot 1.5 Load Time=People(1+0.5)=People1.5

总时间实际上为:
Total Time per Roof = 2 ⋅ Distance 50 + People ⋅ 1.5 \text{Total Time per Roof} = 2 \cdot \frac{\text{Distance}}{50} + \text{People} \cdot 1.5 Total Time per Roof=250Distance+People1.5

最终,精确到分钟,需要向上取整:
Final Time = ⌈ Total Time per Roof ⌉ \text{Final Time} = \lceil \text{Total Time per Roof} \rceil Final Time=Total Time per Roof


💯 思路解析

将解题分为下列步骤:

1. 读取输入

  • 第一行读取 n n n,表示屋顶总数。
  • 接下来的 n n n 行读取每个屋顶的坐标 ( x , y ) (x, y) (x,y) 和人数 r r r

2. 计算屋顶时间

  • 根据坐标计算屋顶和大本营的相实距离:
    Distance = x 2 + y 2 \text{Distance} = \sqrt{x^2 + y^2} Distance=x2+y2
  • 根据上面公式计算每个屋顶的时间并精确到分钟:
    Time = ( Distance / 50 ) × 2 + r × 1.5 \text{Time} = (\text{Distance} / 50) \times 2 + r \times 1.5 Time=(Distance/50)×2+r×1.5

3. 结果精确取整

  • 将所有屋顶的时间紧总和,并通过向上取整。

💯 完整解决代码

使用 C++ 实现:

#include <iostream>
#include <cmath>
using namespace std;int main() {int n; // 屋顶数量cin >> n;double total_time = 0; // 总时间初始化为 0for (int i = 0; i < n; i++) {double x, y; // 坐标int r;       // 人数cin >> x >> y >> r;// 计算到屋顶的距离double distance = sqrt(x * x + y * y);// 计算单个屋顶所需时间double time = (distance / 50) * 2 + r * 1.5;// 紧总时间total_time += ceil(time);}// 输出总时间cout << (int)ceil(total_time) << endl;return 0;
}

在这里插入图片描述

在这里插入图片描述


💯 突出问题分析

在实现过程中,出现过一些更新和优化,重点如下:

1. 选择正确的数据类型

调查发现,如果屋顶坐标和距离用 int,在解析输入为浮点数时,将会丢失精度。

解决方案

将坐标声明为浮点型:

double x, y;

2. 取整的位置

有些方案在屋顶时间总和时才取整,导致粘进值问题。

优化思路

在计算单个屋顶时就取整:

total_time += ceil(time);

3. 边界情况处理

  • 如果输入 n = 0 n = 0 n=0,必须特别处理:
if (n == 0) {cout << 0 << endl;return 0;
}
  • 如果人数为 0 0 0,只计算距离时间,不要含及上船和下船。

💯 复杂度分析

1. 时间复杂度

  • 输入为 n n n 个屋顶,每个屋顶计算距离和时间,复杂度为:
    O ( n ) O(n) O(n)

2. 空间复杂度

  • 只使用常数量的变量,空间复杂度为:
    O ( 1 ) O(1) O(1)

💯 学习收获和应用

通过该题目,我们学习到如下点:

  1. 在复杂场景中分解问题的思路:通过分解每个屋顶的时间,将复杂问题分解为许多小问题。
  2. 选择正确的数据类型:特别是处理浮点数时,需要保证计算精度。
  3. 处理边界情况:在突出输入时,须要考虑特殊情况,如屋顶数量为 0 或人数为 0。

💯 小结

通过该题目解决,我们基于 C++ 给出了进一步的优化,包括类型选择、取整位置和边界情况处理。这些优化不仅能解决本题,对于复杂程序进一步深入优化也具有往往运用实际意义。

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


在这里插入图片描述


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

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

相关文章

WPS工具栏灰色怎么办

WPS离线不登录&#xff0c;开启工具栏等相关功能 当你在使用WPS的过程中&#xff0c;若因网络问题或其他特殊原因&#xff0c;导致无法登录使用WPS时&#xff0c;可根据以下步骤开启离线兼容模式&#xff0c;开启此模式后&#xff0c;可在未登录的状态下&#xff0c;激活并使用…

反射探针.

一、在unity场景中如何添加反射探针&#xff1f; 可以先添加一个空对象&#xff0c;在空对象的上方添加反射探针组件&#xff08;Reflection Probe&#xff09; 反射探针的类型有&#xff1a;Baked、Custom、Realtime 其中“Baked”反射探针类型&#xff0c;可以将场景中的静态…

SecureCRT汉化版

目录 9.5.1版 8.1.4版 下载链接 SecureCRT 和 SecureFX 是由 VanDyke Software 开发的专业工具&#xff0c;分别专注于安全的终端仿真与文件传输。SecureCRT 提供高效的终端仿真和多协议支持&#xff0c;是网络管理和系统配置的首选工具&#xff1b;SecureFX 则致力于安全的…

回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测

回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实现CNN-LSSVM…

使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;WebStorm 目录 出现错误的情况 报错&#xff1a; 代码&#xff1a; 报错截图 原因分析 解决方案 方法一 方法二 出现错误的情况 以下是我遇到该错误时遇到的报错和代码&…

【知识】cuda检测GPU是否支持P2P通信及一些注意事项

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 代码流程 先检查所有GPU之间是否支持P2P通信&#xff1b;然后尝试启用GPU之间的P2P通信&#xff1b;再次检查所有GPU之间是否支持P2P通信。 test.cu&…

专栏二十三:Python读取和分析空间数据的经验杂谈

部分情况同样适合单细胞的分析结果 读取数据阶段 1.错误的library_id 包括sc和sq的两种读取方式&#xff0c;大同小异。 理论上有h5数据和spatial文件夹就可以读取成功&#xff0c;并且自动赋予和文件名一样的library_id&#xff0c;例如 slide sq.read.visium("/ho…

《软件设计的哲学》阅读摘要之设计原则

《软件设计的哲学》&#xff08;A Philosophy of Software Design&#xff09;是一本在软件架构与设计领域颇具影响力的书籍&#xff0c;作者 John Ousterhout 在书中分享了诸多深刻且实用的软件设计理念。书中列举的这些设计原则&#xff0c;汇聚了作者丰富的实战经验与深邃的…

Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行

一、部署LDAP 1、安装LDAP yum install -y openldap-servers openldap-clients openldap openldap-devel compat-openldap openldap-servers-sql systemctl start slapd systemctl enable slapd2、创建第一个管理账号密码&#xff08;设置为ldapadmin&#xff09; slappass…

【MySQL基础篇】多表查询(隐式/显式内连接、左/右外连接、自连接查询、联合查询、标量/列/行/表子查询)

Hiヽ(゜▽゜ )&#xff0d;欢迎来到蓝染Aizen的CSDN博客~ &#x1f525; 博客主页&#xff1a; 【✨蓝染 の Blog&#x1f618;】 &#x1f496;感谢大家点赞&#x1f44d; 收藏⭐ 评论✍ 文章目录 MySQL基础篇-多表查询一、多表关系1. 一对多2. 多对多3. 一对一 二、多表查询…

【踩坑记录】C编程变量未初始化导致的程序异常

1、在编程的时候养成良好的习惯&#xff0c;定义变量以后记得给变量初始化&#xff0c;不然可能会产生一些意想不到的Bug。 2、比如下面的例子&#xff0c;如果定义的变量没有被初始化就有可能是一个随机值。如果代码少还好&#xff0c;很容易排查出来。但如果是一个比较大的项…

如何查看pad的console输出,以便我们更好的进行调试,查看并了解实际可能的问题。

1、以下是baidu AI回复&#xff1a; 2、说明&#xff1a; 1&#xff09;如果小伙伴们经常做android开发的话&#xff0c;这个不陌生&#xff0c;因为调试都是要开启这个开发者模式。并启用USB调试模式。 2&#xff09;需要连上USB线&#xff0c;有的时候会忘记&#xff0c;然…

c++ [spdlog 配置与使用]

一、 下载spdlog https://codeload.github.com/gabime/spdlog/zip/refs/heads/v1.x spdlog链接 二、配置工程编译&#xff0c;和eigen库类似spdlog无需单独编译 拷贝到工程目录下 配置目录 稍微封装一下符合qDebug() 使用习惯 /* ** File name: LogSystem.h ** Auth…

leetcode-80.删除有序数组的重复项II-day12

总结&#xff1a;不必过于死磕一道题目&#xff0c;二十分钟没做出来就可参考题解

ES已死,文本检索永生

长期以来&#xff0c;混合查询&#xff08;Hybrid Search&#xff09;一直是提升 RAG&#xff08;Retrieval-Augmented Generation&#xff09;搜索质量的重要手段。尽管基于密集向量&#xff08;Dense Embedding&#xff09;的搜索技术随着模型规模和预训练数据集的不断扩展&a…

【Web】2024“国城杯”网络安全挑战大赛决赛题解(全)

最近在忙联通的安全准入测试&#xff0c;很少有时间看CTF了&#xff0c;今晚抽点时间回顾下上周线下的题(期末还没开始复习&#x1f622;) 感觉做渗透测试一半的时间在和甲方掰扯&水垃圾洞&#xff0c;没啥惊喜感&#xff0c;还是CTF有意思 目录 Mountain ez_zhuawa 图…

VS2022 中的 /MT /MTd /MD /MDd 选项

我们有时编译时,需要配置这个 运行库,指定C/C++运行时库的链接方式。 如下图 那么这些选项的含义是什么? /MT:静态链接多线程库 /MT选项代表“Multi-threaded Static”,即多线程静态库。选择此选项时,编译器会从运行时库中选择多线程静态连接库来解释程序中的代码,…

前端常用算法集合

使用前介绍 不借助临时变量&#xff0c;交换整数 加减乘除法 注意&#xff1a;如果是浮点数&#xff0c;对于加减乘除法需要注意浮点数的精度丢失问题。 对象法 数组法 数组去重 方法1&#xff08;filter&#xff0c;推荐使用&#xff09; 方法2&#xff08;新数组法&#xff…

保护模式基本概念

CPU 架构 RISC&#xff08;Reduced Instruction Set Computer&#xff09; 中文即"精简指令集计算机”。RISC构架的指令格式和长度通常是固定的&#xff08;如ARM是32位的指令&#xff09;、且指令和寻址方式少而简单、大多数指令在一个周期内就可以执行完毕 CISC&…

62.基于SpringBoot + Vue实现的前后端分离-驾校预约学习系统(项目+论文)

项目介绍 伴随着信息技术与互联网技术的不断发展&#xff0c;人们进到了一个新的信息化时代&#xff0c;传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须&#xff0c;提升管理高效率&#xff0c;各种各样管理管理体系应时而生&#xff0c;各个领域陆续进…