洛谷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++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ