题解 | #自动售货系统#

自动售货系统

https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf

我看大家用的退钱的方法都是贪心,

但是如果这样的情况呢?

如1, 2, 5, 10的个数分别是 0, 3, 1, 1

需要退钱 6 元 那么只能返回5块钱1个

但是正确答案应该是2+2+2吧?

是测试案例没有覆盖到? 还

是优先度 张数最少 > 正确匹配?

#include <bits/types/mbstate_t.h>
#include <iostream>
#include <map>
#include <vector>
using namespace std;

map<string, int> nameToInt = {
    {"A1", 0},
    {"A2", 1},
    {"A3", 2},
    {"A4", 3},
    {"A5", 4},
    {"A6", 5}
};

class Good {
  public:
    string name;
    int price;
    int num = 0;

    Good(string name, int price, int num) {
        this->name = name;
        this->price = price;
        this->num = num;
    }

    void buyOne() {
        this->num -= 1;
    }
    // void setNum(int num) {
    //     this->num = num;
    // }
};

class MoneyBox {
  public:
    int num10, num5, num2, num1;

    MoneyBox(int num1, int num2, int num5, int num10) {
        this->num1 = num1;
        this->num2 = num2;
        this->num5 = num5;
        this->num10 = num10;
    }
};

vector<string> split(string sentence, char target = ' ') {
    vector<string> ans;
    int left = 0;
    // int right = 1;
    int now = 0;
    while (now < sentence.size()) {
        if (sentence.at(now) == target) {
            // cout << left << ' ' << now << endl;
            ans.push_back(sentence.substr(left, now - left));
            left = now + 1;
            now = left;
            continue;
        }
        now++;
    }
    // cout << left << ' ' << now << endl;
    ans.push_back(sentence.substr(left, now - left));
    return ans;
}

vector<Good> inithialGood(string nums) {
    vector<string> num_list = split(nums, '-');

    // for(auto num : num_list){
    //     cout << num << endl;
    // }

    Good A1 = Good("A1", 2, stoi(num_list[0]));
    Good A2 = Good("A2", 3, stoi(num_list[1]));
    Good A3 = Good("A3", 4, stoi(num_list[2]));
    Good A4 = Good("A4", 5, stoi(num_list[3]));
    Good A5 = Good("A5", 8, stoi(num_list[4]));
    Good A6 = Good("A6", 6, stoi(num_list[5]));

    vector<Good> goods;
    goods.push_back(A1);
    goods.push_back(A2);
    goods.push_back(A3);
    goods.push_back(A4);
    goods.push_back(A5);
    goods.push_back(A6);

    return goods;
}

MoneyBox initialMoneyBox(string money) {
    vector<string> moneys = split(money, '-');
    MoneyBox moneybox = MoneyBox(stoi(moneys[0]), stoi(moneys[1]), stoi(moneys[2]),
                                 stoi(moneys[3]));

    return moneybox;
}

map<int, int> returnMoney(int money_int_left, MoneyBox& moneybox) {
    map<int, int> change = {
        {1, 0},
        {2, 0},
        {5, 0},
        {10, 0}
    };

    while (money_int_left >= 10) {
        if (moneybox.num10 > 0) {
            money_int_left -= 10;
            change.at(10) += 1;
            moneybox.num10 -= 1;
        } else {
            break;
        }
    }
    while (money_int_left >= 5) {
        if (moneybox.num5 > 0) {
            money_int_left -= 5;
            change.at(5) += 1;
            moneybox.num5 -= 1;
        } else {
            break;
        }
    }
    while (money_int_left >= 2) {
        if (moneybox.num2 > 0) {
            money_int_left -= 2;
            change.at(2) += 1;
            moneybox.num2 -= 1;
        } else {
            break;
        }
    }
    while (money_int_left >= 1) {
        if (moneybox.num10 > 0) {
            money_int_left -= 1;
            change.at(1) += 1;
            moneybox.num1 -= 1;
        } else {
            break;
        }
    }

    return change;
}

void execution(vector<string> cmd_list) {
    vector<Good> goods;
    MoneyBox moneybox = MoneyBox(0, 0, 0, 0);
    int money_int_left = 0;

    for (string cmd : cmd_list) {
        vector<string> cmds = split(cmd);

        // cout << cmds[0] << endl;
        if (cmds[0] == "r") {
            goods = inithialGood(cmds[1]);

            moneybox = initialMoneyBox(cmds[2]);

            cout << "S001:Initialization is successful" << endl;
            // cout << moneybox.num1 << " " << moneybox.num2 << " " << moneybox.num5 << " " <<
            //      moneybox.num10 << endl;
            // cout << goods[0].name << " " << goods[0].price << " " << goods[0].num << endl;


        } else if (cmds[0] == "p") {
            int money_int = stoi(cmds[1]);

            if (money_int != 1 && money_int != 2 && money_int != 5 && money_int != 10) {
                cout << "E002:Denomination error"  << endl;
                continue;
            } else if (moneybox.num1 + moneybox.num2 * 2 < money_int) {
                if (money_int == 5 || money_int == 10) {
                    cout << "E003:Change is not enough, pay fail" << endl;
                    continue;
                }
            } else if (goods[0].num + goods[1].num + goods[2].num +
                       goods[3].num + goods[4].num + goods[5].num
                       == 0) {
                cout << "E005:All the goods sold out" << endl;
                continue;
            } else {
                money_int_left += money_int;
                if(money_int == 10){
                    moneybox.num10 += 1;
                }else if(money_int == 5){
                    moneybox.num5 += 1;
                }else if(money_int == 2){
                    moneybox.num2 += 1;
                }else if(money_int == 1){
                    moneybox.num1 += 1;
                }
                cout << "S002:Pay success,balance=" << money_int_left << endl;
            }
        } else if (cmds[0] == "b") {
            string good_name = cmds[1];

            // if(good_name != "A1" && good_name != "A2" && good_name != "A3" &&
            //     good_name != "A4" && good_name != "A5" && good_name != "A6"){
            if (nameToInt.find(good_name) == nameToInt.end()) {
                cout << "E006:Goods does not exist" << endl;
                continue;
            } else if (goods.at(nameToInt.at(good_name)).num == 0) {
                cout << "E007:The goods sold out" << endl;
                continue;
            } else if (money_int_left < goods.at(nameToInt.at(good_name)).price) {
                cout << "E008:Lack of balance" << endl;
                continue;
            } else {
                money_int_left -= goods.at(nameToInt.at(good_name)).price;
                goods.at(nameToInt.at(good_name)).buyOne();
                cout << "S003:Buy success,balance=" << money_int_left << endl;
            }
        } else if (cmds[0] == "c") {
            if (money_int_left == 0) {
                cout << "E009:Work failure" << endl;
                continue;
            } else {
                map<int, int> change = returnMoney(money_int_left, moneybox);
                cout << "1 yuan coin number=" << change.at(1) << endl;
                cout << "2 yuan coin number=" << change.at(2) << endl;
                cout << "5 yuan coin number=" << change.at(5) << endl;
                cout << "10 yuan coin number=" << change.at(10) << endl;
                money_int_left = 0;
            }
        } else if (cmds[0] == "q") {
            if (cmds[1] == "0"){
                for(int i = 0; i < 6; i++){
                    cout << goods.at(i).name << " " << goods.at(i).price << " " << goods.at(i).num << endl;
                }
            } else if(cmds[1] == "1"){
                cout << "1 yuan coin number=" << moneybox.num1 << endl;
                cout << "2 yuan coin number=" << moneybox.num2 << endl;
                cout << "5 yuan coin number=" << moneybox.num5 << endl;
                cout << "10 yuan coin number=" << moneybox.num10 << endl;
            } 
        }else if(cmds[0] == ""){
                continue;
        }else{
            cout << "E010:Parameter error" << endl;
        }
    }
}

int main() {
    string sentence;
    getline(cin, sentence);
    vector<string> cmd_list;
    cmd_list = split(sentence, ';');
    // for(auto cmd : cmd_list){
    //     cout << cmd << endl;
    // }
    execution(cmd_list);

}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

01-24 08:13
已编辑
合肥工业大学 Java
程序员牛肉:没啥问题。标准的流水线简历,但是学历好一点,所以应该是有约面的机会的。 这段时间可以考虑把自己的两个项目彻底的理一理。争取能够讲清楚每一个功能点
点赞 评论 收藏
分享
vegetable_vegetable:我也是这个部门这个岗位,但我投的是测开,却被后端捞了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务