实现一个收银系统
in Algorithm Pageviews
一个无人便利点急需一个收银系统,可以实现自动收银和找零。支持的面额有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]};
}
};