[nowcoder] 薯队长 的电商管理

链接:https://ac.nowcoder.com/acm/contest/68298/D?&headNav=acm
来源:牛客网

题目描述

​ 滴滴滴,紧急求助!“薯队长”突然发来了一条私信,董洁、姜思达、章小蕙等小红书博主的直播间太太太火爆!!!需要身为“技术薯”同学的你赶快支援支援,做个临时的电商管理系统。

这可是你的强项了,只见你轻抿了一口赛博美式,马上回了一个“已阅”的表情。

看了看已经完成各种需求评审和排期工作的需求说明,该系统需要支持以下功能:

​ 1. 商家上架商品(商品名称,库存),该商品被用户视为可见。

​ 2. 买家购买商品(输入商品名称及数量)。若商品不存在或者库存不足则购买失败。

​ 3. 买家付款阶段,若付款成功则购买成功,否则该商品返回库存。

​ 4. 商家直接下架某商品,库存直接清空。当执行下架操作后,该名字的商品将无法再被购买(等待买家付款的商品依然可以付款,仍然按没有下架的状态来输出相关信息,但因为商品是下架状态,所以无论付款是否成功都不影响实际库存),直到重新上架。另外,若某商品重新上架后,买家购买失败,则依然会返回库存。

​ 请按对应输入,输出正确的内容。详情请参考输入、输出描述和样例。

输入描述:

第一行输入一个正整数 qqq,代表操作次数。
接下来的 qqq 行,每行输入一个字符串,代表一次操作。

上架操作:
xx xxx(s) is(are) added.
其中第一个变量为正整数,代表上架的商品数量。第二个为字符串,代表上架的商品名字,若第一个变量大于 1,则商品名字末尾需要加 's' 字符,并且系动词 "is" 变成 "are"。(本题所有复数均不考虑加 "es" 等英语语法,直接加 's' 即可)。

买家操作:
xx xxx(s) is(are) bought.
其中第一个变量为正整数,代表购买的商品数量。第二个为字符串,代表购买的商品名字,若第一个变量大于 1,则商品名字末尾需要加 's' 字符,并且系动词 "is" 变成 "are"。

付款操作:
若付款成功,则输入 "payment completed."。否则输入 "payment failed."其中该付款操作对应的是从先到后购买顺序最早购买的未付款交易的购买操作对应的订单(如果付款失败,将移出等待付款的订单队列,并不会二次付款)。

下架操作:
xxx is off shelf.
其中变量"xxx"为字符串,代表下架的商品名字。

所有的输入保证均符合题目描述的语法。保证付款操作时,当前系统内存在至少一个正在付款阶段的订单。
操作次数不超过 1000 次。

输出描述:

所有操作均需要判断操作是否成功:
上架操作均保证是合法操作。直接输出"adding succeed."
买家购买商品时,若库存不足或商品不存在(或已下架),输出"buying failed.",否则输出"buying succeed."
买家付款成功时,输出一行"xx xxx(s) will be delivered as soon."。付款失败输出"xx xxx(s) has(have) been removed from shopping cart."。其中付款失败的 have/has 取决于商品数量,大于 1 时使用 have,等于 1 时使用 has。
下架操作时,若商家尝试下架一个未被上架/已下架的商品,则输出"xxx has already been off shelf."。否则视为下架成功,输出"delisting succeed."

示例1

输入

11
3 books are added.
1 car is added.
2 buss are added.
1 bus is bought.
1 buss is bought.
car is off shelf.
1 car is bought.
1 book is bought.
payment failed.
payment completed.
3 books are bought.

输出

adding succeed.
adding succeed.
adding succeed.
buying succeed.
buying failed.
delisting succeed.
buying failed.
buying succeed.
1 bus has been removed from shopping cart.
1 book will be delivered as soon.
buying failed.

说明

前 3 次操作,上架成功。
第 4 次操作,购买 1 个 bus 的订单进入付款阶段。
第 5 次操作,由于并不存在 buss 的商品,购买失败。
第 6 次操作,car 下架。
第 7 次操作,尝试购买已下架的商品 car,购买失败。
第 8 次操作,购买 1 个 book 的订单进入付款阶段。
第 9 次操作,购买 1 个 bus 的订单付款失败,1 个 bus 返回库存。
第 10 次操作,购买 1 个 book 的订单付款成功,即将发货。
第 11 次操作,此时 book 的库存只剩 2 个,购买失败。

示例2

输入

11
12 cars are added.
5 cars are bought.
car is off shelf.
payment failed.
4 cars are added.
5 cars are bought.
3 cars are bought.
car is off shelf.
1 car is added.
payment failed.
2 cars are bought.

输出

adding succeed.
buying succeed.
delisting succeed.
5 cars have been removed from shopping cart.
adding succeed.
buying failed.
buying succeed.
delisting succeed.
adding succeed.
3 cars have been removed from shopping cart.
buying succeed.

说明

该样例对应的操作细节如下:
首先 12 个 car 上架。
顾客下单购买 5 个 car 。购买成功。
car 下架。

购买失败。5个 car 返回购物车。但由于此时 car 是下架,因此仍然是库存清空状态。库存仍然是 0。此时虽然输出了“5 cars have been removed from shopping cart.”,但其实不影响实际库存。
4 个 car 上架。此时 car 的库存是 4 。
顾客下单购买 5 个 car 。购买失败。

顾客下单购买 3 个 car 。购买成功。car 下架。
1 个 car 重新上架,库存是1 。
购买失败。2个 car 返回购物车。此时car被重新上架了,库存变成 3。
顾客下单购买 2 个 car 。购买成功。

思路

强模题

string的substr(pos, len)函数是从第 pos 位开始,取后面 len 个字符.

map[key],当key不存在时,会返回0,然后在map中插入一个 (key,0) 的键值对。所以使用 map[key] 之前要判断是否存在这个key。即map.find() != map.end()时才能使用

代码

#include <bits/stdc++.h>
using namespace std;

queue<pair<string, int>> q;
map<string,int> m;
string s;

int main()
{
    int t;
    cin >> t;
    getline(cin, s);
    while (t--)
    {
        string s;
        getline(cin, s);
        int len = s.length();
        // 上架操作
        //  "xx xxx(s) is(are) added."
        //  "xx xxx is added."
        //  "xx xxxs are added."
        if (s.substr(len - 6, 6) == "added.")
        {
            int num = 0, i = 0;
            for (i = 0; i < len; i++)
            {
                if ((s[i] >= '0') and (s[i] <= '9'))
                {
                    num = num * 10 + s[i] - 48;
                }
                else{
                    break;
                }
            }
            string file_name;
            if (num == 1)
            {
                file_name = s.substr(i + 1, len - 10 - i - 1);
            }
            else
            {
                file_name = s.substr(i + 1, len - 12 - i - 1);
            }
            m[file_name] += num;
            cout << "adding succeed.\n";
        }
        // 买家操作
        // xx xxx(s) is(are) bought.
        // xx xxxs are bought.
        // xx xxx is bought.
        else if (s.substr(len - 7, 7) == "bought.")
        {
            int num = 0, i = 0;
            for (i = 0; i < len; i++)
            {
                if ((s[i] >= '0') and (s[i] <= '9'))
                {
                    num = num * 10 + s[i] - 48;
                }
                else{
                    break;
                }
            }
            string file_name;
            if (num == 1){
                file_name = s.substr(i + 1, len - 11 - i - 1);
            }
            else{
                file_name = s.substr(i + 1, len - 13 - i - 1);
            }
            if ((m.find(file_name) == m.end()) or (m[file_name] < num)){
                cout<<"buying failed.\n";
            }else{
                m[file_name] -= num;
                cout<<"buying succeed.\n";
                q.push(make_pair(file_name,num));
            }
        }
        // 付款操作
        else if (s == "payment completed.")
        {
            string file_name = q.front().first;
            int num = q.front().second;
            q.pop();
            if (num == 1){
                cout<<to_string(num) + " " + file_name + " will be delivered as soon.\n";
            } 
            else {
                cout<<to_string(num) + " " + file_name + "s will be delivered as soon.\n";
            }
        }
        else if (s == "payment failed.")
        {
            string file_name = q.front().first;
            int num = q.front().second;
            q.pop();
            if (num == 1){
                cout<<to_string(num) + " " + file_name + " has been removed from shopping cart.\n";
            } 
            else {
                cout<<to_string(num) + " " + file_name + "s have been removed from shopping cart.\n";
            }
            if (m.find(file_name) != m.end()){
                m[file_name] += num;
            }
        }
        // 下架操作
        // xxx is off shelf.
        else if (s.substr(len - 6, 6) == "shelf.")
        {
            string file_name = s.substr(0, len - 14);
            if (m.find(file_name) == m.end()){
                cout<<file_name + " has already been off shelf.\n";
            } else{
                m.erase(file_name);
                cout<<"delisting succeed.\n";
            }
        }
    }
}
posted @ 2023-10-25 11:55  Un-Defined  阅读(8)  评论(0编辑  收藏  举报