洛谷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++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用