洛谷C++简单题小练习day8—Bookshelf B

2024-01-31 14:12

本文主要是介绍洛谷C++简单题小练习day8—Bookshelf B,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

day8--Bookshelf B--1.30

习题概述

题目描述

Farmer John 最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。

所有(1≤N≤20,000) N头奶牛都有一个确定的身高Hi​(1≤Hi​≤10,000)。设所有奶牛身高的和为S书架的高度为B,并且保证1≤B≤S<2,000,000,007。

为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。

显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少(身高 高的先上)。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。

输入格式

     第 1 行: 2 个用空格隔开的整数:N 和 B;

     第 2…N+1 行: 第 i+1 行是 1 个整数:Hi​。

输出格式

      第 1行: 输出 1个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部。

代码部分

#include<bits/stdc++.h>
using namespace std;
int high[20005];//数组high 存储奶牛身高 
bool cmp(int a,int b)//自定义比较函数从大到小
{return a>b;
}
int main()
{int n,b;//n表示奶牛数量,b表示书架高度 cin>>n>>b;for(int i=0;i<n;i++)//循环读取每头奶牛的身高 {cin>>high[i];}sort(high,high+n,cmp);//sort变为从大到小排序 int sum=0,ans=0;//表示当前奶牛塔的总高度和塔中奶牛的数量 while(sum<b)//只要高度不够就继续叠{sum+=high[ans];ans++;}cout<<ans;return 0;
}

心得体会

1.这个习题要求计算最少需要多少头奶牛才能够使它们的身高之和达到或超过给定的书架高度。

解决这个问题的思路:先将奶牛的身高从大到小进行排序,然后从最高的奶牛开始累加身高,直到累加的身高达到或超过书架的高度。通过计数器记录累加的奶牛数量,最后输出计数器的值即为最少所需的奶牛数量。

2.在C++标准库中,sort函数默认是按升序进行排序的。但本题需要按照奶牛的身高从大到小进行排序,以便从最高的奶牛开始叠加身高按降序排序,所以使用sort函数结合自定义的比较函数cmp来实现。

3.如果不想使用自定义函数那么需要有几处修改为

sort(high, high + n);   

sum += high[n - 1 - ans]; ans++;

解释:

sum += high[n - 1 - ans] 的语句时,在每次循环中将数组 high 中的最后一个元素(即最大的身高,此时是利用sort所排的升序)添加到 sum 中。n 是奶牛的数量,而 ans 是一个计数器,表示已经叠加的奶牛的数量。

为了从最高的奶牛开始叠加身高,因为数组 high 在经过排序后最后一个元素(即 high[n - 1])代表的是最大的身高。所以 n - 1 - ans 来访问数组 high 的最后一个元素。

ans++ 会将计数器 ans 的值增加 1,以便在下一轮循环中继续叠加下一个身高。


下面是更改后的代码:(代码看似简单,但需要仔细考虑)

#include<bits/stdc++.h>
using namespace std;
int high[20005];  // 数组high 存储奶牛身高
int main()
{int n, b;  // n表示奶牛数量,b表示书架高度cin >> n >> b;for(int i = 0; i < n; i++)  // 循环读取每头奶牛的身高{cin >> high[i];}sort(high, high + n);  // sort默认升序排序int sum = 0, ans = 0;while(sum < b)  // 只要高度不够就继续叠{sum += high[n - ans - 1];ans++;}cout << ans;return 0;
}

这篇关于洛谷C++简单题小练习day8—Bookshelf B的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/664055

相关文章

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核