【蓝桥杯选拔赛真题54】C++分糖果游戏 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

本文主要是介绍【蓝桥杯选拔赛真题54】C++分糖果游戏 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

C++分糖果游戏

一、题目要求

1、编程实现

2、输入输出

二、算法分析

三、程序编写

四、程序说明

五、运行结果

六、考点分析

七、推荐资料


C++分糖果游戏

第十四届蓝桥杯青少年创意编程大赛C++选拔赛真题

一、题目要求

1、编程实现

现有N罐糖果,且已知每罐糖果的初始数量。现给出两个数值L和R(L,R),需要把每罐糖果的数量调整为:L≤任意一罐糖果的数量≤R。调整的方式是每次从其中一罐糖果中拿出1块放到其他糖果罐中。请你计算出最少调整几次才能使每罐糖果的数量都在L到R范围之间,如果不能将每罐糖果都调整到L到R范围之间则输出-1。
例如:N=2,2罐糖果的初始数量为3和8,L=3,R=6,通过调整使得:3≤任意一罐糖果的数量≤6,调整方式如下:

  • 第一次从初始数量为8的罐中拿1块放到初始数量为3的罐中,调整后为(4,7)
  • 第二次从数量7的罐中拿1块放到数量为4的罐中,调整后为(5,6)

故最少调整2次

2、输入输出

输入描述:第一行输入一个正整数N(N<30),表示糖果的罐数

第二行输入N个正整数(1≤正整数≤100),表示每糖果的初始数量,每个正整数之间以一个空格隔开

第三行输入两个正整数L,R(1≤LSR≤100),表示每糖果的数量所要调整的范围,两个正整数之间以一个空格隔开

输出描述:只有一行,一个整数,即输入的第二个整数。

输入样例:

2
3 8
3 6

输出样例:

2

二、算法分析

  1. 从给定题目的初步分析可以看出,有一定的难度,输入的数可以使用一维数组进行保存
  2. 接着其实可以对这个数组进行排序,只要每次比较数组中的第一个数是否比L小,以及数组中最后一个数是否比R大,如果是就将第一个加1,最后一个减1,进行一轮之后统计次数加1,再次继续刚才的步骤,直到数组中的每个数都在L和R之间,就输出统计次数
  3. 还有一种情况就是怎么调整都达不到要求,这种情况又有两种情况,一种是输入的所有数字之和都小于n*L,另外一种情况就是所有数字之和大于n*R;如果是这两种情况就输出-1

三、程序编写

#include<iostream>
#include<algorithm>
using namespace std;
int a[33];
int main()
{int n,l,r,cnt = 0,sum = 0;cin >> n;for(int i=0;i<n;i++){cin >> a[i];sum += a[i];}cin >> l >> r;if(sum < l * n || sum > r * n)cout << -1 << endl;else{sort(a,a+n);while(a[0]<l || a[n-1]>r){a[0] += 1;a[n-1] -= 1;cnt ++;sort(a,a+n);}cout << cnt << endl;}
}

四、程序说明

  1. 首先需要导入输入输出流头文件
  2. 接着导入算法头文件,为了后面使用sort函数
  3. 然后是引入std命名空间中的所有成员到当前的程序中,这样在当前的程序中就可以直接使用 std 命名空间中的所有成员,而不需要使用的时候在成员前面加上(std::)前缀
  4. 接着定义了一个整型数组a[33],用来存储输入的n个数字
  5. 接着是主函数入口声明5个变量:n(输入的个数),l(区间最小值),r(区间最大值),cnt(调整的次数),sum(输入数字之和)
  6. 接着输入n的值, 使用for循环输入n个数字,并累加它们的和
  7. 接着输入l和r的值, 判断数组a的总和是否满足要求,如果不满足则输出-1
  8. 如果满足要求,则对数组a进行排序; 使用循环判断数组a的最小值是否小于l,最大值是否大于r,如果满足条件则跳出循环
  9. 如果不满足条件,则将数组a的第一个元素加1,最后一个元素减1,并对数组a进行排序, 每次循环结束后,计数器cnt加1
  10. 最终输出计数器的值,即为满足条件的最小次数
  11. 最后利用输出流对象cout,输出最小次数
  12. 最后返回0,程序结束

 本文作者:小兔子编程 作者首页:https://blog.csdn.net/frank2102

五、运行结果

2
3 8
3 62

六、考点分析

难度级别:中等,这题相对而言还是比较简单的,具体主要考查如下:

  1. 充分掌握变量的定义和使用
  2. 掌握一维数组的定义和相关使用
  3. 学会输入流对象cin的使用,从键盘读入相应的数据
  4. 学会for循环的使用,在确定循环次数的时候推荐使用学会
  5. 学会while循环的使用,在不确定循环次数的时候推荐使用
  6. 学会if条件判断语句的使用,满足一定条件才能执行后面的语句
  7. 学会if...else...双分支语句的使用,条件满足执行一种处理,不满足执行另一种处理
  8. 学会sort函数的使用,对数组进行从小到达排序
  9. 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
  10. 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
  11. 充分掌握变量定义和使用、分支语句、循环语句和简单算法知识的使用及输入输出的用法

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

七、推荐资料

  • 所有考级比赛学习相关资料合集【推荐收藏】

这篇关于【蓝桥杯选拔赛真题54】C++分糖果游戏 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

从入门到精通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方法。右键项目的属性:

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

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. 核心价值二