੭ ᐕ)੭*⁾⁾889 2025-12-27 21:31 采纳率: 60%
浏览 9

C++求思路自己写的不太对

到了某公司发工资的日期,财务部的小明最近在考虑一个问题:如果每个员工的工资额都知道,最少需要准备多少张人民币,才能在给每位员工发工资的时候都不用员工找零呢?这里假设员工的工资都是正整数,单位元,人民币一共有100元、50元,10元、5元,2元和1元六种。请设计一个函数int salary(n),参数为某个员工的工资,返回值为最少发放的人民币张数。
输入格式:输入数据第一行是一个整数n(n<100),表示员工的人数,然后是n个员工的工资。
输出格式:输出一个整数x,表示至少需要准备的人民币张数。
输入样例: 3 1 2 3
输出样例: 4

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-12-27 21:33
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题分析

    这个问题可以转化为一个经典的数学问题:给定一组正整数(员工的工资),求出最少的硬币数量(人民币)以满足不产生找零的情况。

    解决方案

    可以使用贪心算法来解决这个问题。具体步骤如下:

    1. 将所有员工的工资按从小到大的顺序排列。
    2. 初始化一个变量 max,用来存储当前最大工资。
    3. 初始化一个变量 count,用来存储所需的硬币数量。
    4. 遍历员工的工资,依次将每个工资与 max 进行比较:
    • 如果当前工资小于或等于 max,则将其添加到 count 中,并更新 max 为当前工资。
    • 如果当前工资大于 max,则将其添加到 count 中,并将 max 更新为当前工资的最大整数倍数(即 max 的最大整数倍数小于或等于当前工资)。
    1. 最终 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),因为我们只使用了常数个变量。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月27日