到了某公司发工资的日期,财务部的小明最近在考虑一个问题:如果每个员工的工资额都知道,最少需要准备多少张人民币,才能在给每位员工发工资的时候都不用员工找零呢?这里假设员工的工资都是正整数,单位元,人民币一共有100元、50元,10元、5元,2元和1元六种。请设计一个函数int salary(n),参数为某个员工的工资,返回值为最少发放的人民币张数。
输入格式:输入数据第一行是一个整数n(n<100),表示员工的人数,然后是n个员工的工资。
输出格式:输出一个整数x,表示至少需要准备的人民币张数。
输入样例: 3 1 2 3
输出样例: 4
C++求思路自己写的不太对
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
4条回答 默认 最新
阿里嘎多学长 2025-12-27 21:33关注阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
问题分析
这个问题可以转化为一个经典的数学问题:给定一组正整数(员工的工资),求出最少的硬币数量(人民币)以满足不产生找零的情况。
解决方案
可以使用贪心算法来解决这个问题。具体步骤如下:
- 将所有员工的工资按从小到大的顺序排列。
- 初始化一个变量
max,用来存储当前最大工资。 - 初始化一个变量
count,用来存储所需的硬币数量。 - 遍历员工的工资,依次将每个工资与
max进行比较:
- 如果当前工资小于或等于
max,则将其添加到count中,并更新max为当前工资。 - 如果当前工资大于
max,则将其添加到count中,并将max更新为当前工资的最大整数倍数(即max的最大整数倍数小于或等于当前工资)。
- 最终
count中的值即为所需的硬币数量。
核心代码
#include <vector> #include <algorithm> int minCoins(std::vector<int>& salaries) { std::sort(salaries.begin(), salaries.end()); int max = 0; int count = 0; for (int salary : salaries) { if (salary <= max) { count++; max = salary; } else { count++; max = (max + salary - 1) / salary * salary; } } return count; }注意
这个算法的时间复杂度为 O(n log n),其中 n 是员工的数量。空间复杂度为 O(1),因为我们只使用了常数个变量。
解决 无用评论 打赏 举报