刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

帮助

题目描述:

已知有M名需要帮助的贫困学生,及每名学生购买图书的金额;和N位愿意提供帮助的志愿者,及每名志愿者愿意帮助的金额。

现N名志愿者认领贫困生进行帮助,每人可以认领贫困学生的名额不限,但如果志愿者愿意帮助的金额小于每名贫困生购买图书的金额,那么该志愿者不能认领贫困学生。请你计算出这些志愿者最多可以认领多少名贫困学生(一名学生只能被一名志愿者认领)。

例如:M=5,N=2

5名贫困学生购买图书金额分别是:200、145、240、50、45,2名志愿者帮助金额分别为150、300。则最多可以认领4名学生。(金额300的志愿者认领200、50、45这3名学生,金额150的志愿者认领145这1名学生)

输入描述:

第一行输入一个正整数M(1<M<200),表示有M名贫困学生

第二行输入M个正整数(10<正整数<300),表示每名贫困生需要购买的图书金额,正整数之间一个空格隔开

第三行输入一个正整数N(1<N<50),表示有N名志愿者

第四行输入N个正整数(10<正整数<10000),表示N名志愿者帮助的金额,正整数之间一个空格隔开

输出描述:

输出一个整数,表示N名志愿者最多可以认领多少名贫困学生


样例输入:

5
200 145 240 50 45
2
150 300

样例输出:

4

使用微信搜索喵呜刷题,轻松应对考试!

答案:

```#include #include #include using namespace std;int main() int M, N;cin >> M;vector students(M);for (int i = 0; i < M; i++) {cin >> students[i];}cin >> N;vector helpers(N);for (int i = 0; i < N; i++) {cin >> helpers[i];}sort(students.rbegin(), students.rend()); // 按照金额从大到小排序int count = 0;for (int i = 0; i < N; i++) {int j = 0;while (j < M && helpers[i] >= students[j]) {count++;j++;}}cout << count << endl;return 0;```

解析:

【喵呜刷题小喵解析】:

这个问题可以通过贪心算法来解决。首先,将贫困学生的购买图书金额从大到小排序,然后依次遍历志愿者,对于每个志愿者,从贫困学生列表的开头开始遍历,如果志愿者的帮助金额大于等于当前贫困学生的购买图书金额,就让志愿者认领这个贫困学生,并增加认领的学生数量。

在算法实现上,我们使用了C++的vector来存储贫困学生和志愿者的信息,以及sort函数来对贫困学生的购买图书金额进行排序。在遍历贫困学生时,我们使用了while循环来寻找当前志愿者能够认领的学生。

在输出时,我们直接输出认领的学生数量。
创作类型:
原创

本文链接:帮助 题目描述: 已知有M名需要帮助的贫困学生,及每名学生购买图书的金额;和N位愿意提供帮助的志愿者

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share