【蓝桥杯选拔赛真题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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C