实现一个收银系统

solve actually problem!

一个无人便利点急需一个收银系统,可以实现自动收银和找零。支持的面额有1元、5元、10元、50元、100元;初始时收银系统有一定数量的1元、5元、10元、50元面额的钞票。

对于每笔付款请求,收银策略如下:

  • 付款小于price时,收款失败,退回所收的钞票;
  • 付款等于price时,收银成功;
  • 付款大于price时,按照“找零钞票最少的原则”进行收银和找零;
    • 若找零成功,收到的钞票计入收银系统;
    • 找零失败,则收银失败,并退回收到的钞票;

请计算结束后,收银系统剩余的从小到大5个面额的钞票数量。

输入:[5,2,5,1]

​ [[47, [0,0,0,0,1]], [2, [0,1,0,0,0]], [1, [1,0,0,1,0]]]

说明:[5,2,5,1]表示初始收银系统中所有的1元、5元、10元、50元面额钞票的数量

[47, [0,0,0,0,1]]表示客户拿一张100元钞票支付一笔47元的账单

输出:[3,2,5,0,1]

#incldue<bits/stdc++.h>

using namespace std;

vector<int> indexCashes = {1,5,10,50,100};

class Solution {
public:
    int GetAllPay(const array<int, 5> &pay)
    {
        int res = 0;
        for (int i = 0; i < indexCashes.size(); i++) {
            res += indexCashes[i] * pay[i]
        }
        return res;
    }

    array<int, 5> Cashier(const vector<int> &initCashes, const vector<pair<int, array<int, 5>>> &payments)
    {
        vector<int> _initCashes(initCashes);
        _initCashes.push_back(0);
        for (const auto &[price, payCoin] : payments) {
            int pay = GetAllPay(payCoint);
            if (pay < price) {
                continue;
            }
            
            if (pay == price) {
                for (int i = 0; i < payCoin.size(); i++) {
                    _initCashes[i] += payCoin[i];
                }
                continue;
            }
            
            for (int i = 0; i < payCoin.size(); i++) {
                _initCashes[i] += payCoinp[i];
            }
            
            // 从最大面额尝试找零
            int charge = pay - price;
            vector<int> chargeCashes(5, 0);
            for (int i = indexCashes.size() - 1; i >= 0; i--) {
                if (charge >= indexCashes[i] && _initCashes[i] > 0) {
                    int num = min(charge / indexCashes[i], _initCashes[i]);
                    charge -= num * indexCashes[i];
                    chargeCashes[i] += num;
                }
            }
            
            // 找零成功,删除出账钞票
            if (charge == 0) {
                for (int i = 0; i < chargeCashes.size(); i++) {
                    _initCashes[i] -= chargeCashes[i];
                }
            } else {
                // 找零失败,退回顾客钞票
                for (int i = 0; i < chargeCashes.size(); i++) {
                    _initCashes[i] -= payCoin[i];
                }
            }
        }
        return {_initCashes[0], _initCashes[1], _initCashes[2], _initCashes[3], _initCashes[4]};
    }
};