本文主要是介绍【蓝桥杯选拔赛真题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
二、算法分析
- 从给定题目的初步分析可以看出,有一定的难度,输入的数可以使用一维数组进行保存
- 接着其实可以对这个数组进行排序,只要每次比较数组中的第一个数是否比L小,以及数组中最后一个数是否比R大,如果是就将第一个加1,最后一个减1,进行一轮之后统计次数加1,再次继续刚才的步骤,直到数组中的每个数都在L和R之间,就输出统计次数
- 还有一种情况就是怎么调整都达不到要求,这种情况又有两种情况,一种是输入的所有数字之和都小于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;}
}
四、程序说明
- 首先需要导入输入输出流头文件
- 接着导入算法头文件,为了后面使用sort函数
- 然后是引入std命名空间中的所有成员到当前的程序中,这样在当前的程序中就可以直接使用 std 命名空间中的所有成员,而不需要使用的时候在成员前面加上(std::)前缀
- 接着定义了一个整型数组a[33],用来存储输入的n个数字
- 接着是主函数入口声明5个变量:n(输入的个数),l(区间最小值),r(区间最大值),cnt(调整的次数),sum(输入数字之和)
- 接着输入n的值, 使用for循环输入n个数字,并累加它们的和
- 接着输入l和r的值, 判断数组a的总和是否满足要求,如果不满足则输出-1
- 如果满足要求,则对数组a进行排序; 使用循环判断数组a的最小值是否小于l,最大值是否大于r,如果满足条件则跳出循环
- 如果不满足条件,则将数组a的第一个元素加1,最后一个元素减1,并对数组a进行排序, 每次循环结束后,计数器cnt加1
- 最终输出计数器的值,即为满足条件的最小次数
- 最后利用输出流对象cout,输出最小次数
- 最后返回0,程序结束
本文作者:小兔子编程 作者首页:https://blog.csdn.net/frank2102
五、运行结果
2
3 8
3 62
六、考点分析
难度级别:中等,这题相对而言还是比较简单的,具体主要考查如下:
- 充分掌握变量的定义和使用
- 掌握一维数组的定义和相关使用
- 学会输入流对象cin的使用,从键盘读入相应的数据
- 学会for循环的使用,在确定循环次数的时候推荐使用学会
- 学会while循环的使用,在不确定循环次数的时候推荐使用
- 学会if条件判断语句的使用,满足一定条件才能执行后面的语句
- 学会if...else...双分支语句的使用,条件满足执行一种处理,不满足执行另一种处理
- 学会sort函数的使用,对数组进行从小到达排序
- 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
- 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
- 充分掌握变量定义和使用、分支语句、循环语句和简单算法知识的使用及输入输出的用法
PS:方式方法有多种,小朋友们只要能够达到题目要求即可!
七、推荐资料
- 所有考级比赛学习相关资料合集【推荐收藏】
这篇关于【蓝桥杯选拔赛真题54】C++分糖果游戏 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!