1 条题解

  • 0
    @ 2025-4-12 19:53:54

    题意分析

    给定一系列销售记录,包含商品 id、销售点 id 和销售数量,需要生成一个二维表格,第一行按升序排列商品 id,第一列按升序排列销售点 id,表格内记录每个销售点对每个商品的总销售数量。若某销售点未销售某商品,则对应单元格为 0。第一行第一列固定为 -1。

    解题思路

    1.使用 map 存储销售信息,其中 map<PII, int> 用于记录每个销售点对每个商品的销售总量,map<int, int> 用于记录商品 id 与序号的映射关系,方便后续按顺序输出。

    2.遍历输入的销售记录,累加每个销售点对每个商品的销售数量,并记录出现过的商品 id。

    3.对商品 id 进行排序,按顺序输出第一行的商品 id。

    4.对每个销售点,按商品 id 的顺序输出其销售情况,若未销售某商品则输出 0。

    分析

    1.由于商品 id 和销售点 id 的范围较大,直接使用二维数组会造成大量空间浪费,因此使用 map 来存储信息,map 会自动对键进行排序,方便按顺序输出。

    2.通过 map<int, vector<PII> > 对每个销售点的销售信息进行分组,便于按销售点输出表格。

    实现步骤

    1.读取输入的记录数量 n

    2.循环读取 n 条销售记录,使用 sale_map 累加每个销售点对每个商品的销售数量,同时使用 g_map 记录出现过的商品 id 及其序号。

    3.输出第一行,先输出 -1,再按升序输出商品 id,并将商品 id 存入 g_vec

    4.将 sale_map 中的信息按销售点分组存入 ans 中。

    5.遍历 ans,按销售点输出表格,对于每个销售点,按商品 id 的顺序输出销售数量,若未销售则输出 0。

    代码实现

    /*
    本题要点:
    1、 排序,按商品id 的顺序输出,所有的商品的数量
    2、 使用 pair<int, int>, map<pair<int, int>, int>
            map<    pair<销售地点id,商品id>, 销售量    >
    */
    
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <map>
    #include <vector>
    #include <algorithm>
    using namespace std;
    typedef pair<int, int> PII;    // 存放 pair<销售地点id,商品id>
    map<PII, int> sale_map;    // PII 到 销售量的 映射
    int n;
    int cnt = 0;
    map<int, int> g_map;    // 商品id 到 cnt 的映射
    vector<int> g_vec;        // 商品id 从小到大 排序
    
    int main()
    {
        scanf("%d", &n);
        cnt = 0;
        int itemId, saleId, num;
        for(int i = 0; i < n; ++i)
        {
            scanf("%d%d%d", &itemId, &saleId, &num);
            PII p = make_pair(saleId, itemId);
            sale_map[p]    += num;            //累加销售量
            if(g_map.find(itemId) == g_map.end())
            {
                g_map[itemId] = ++cnt;
            }
        }
        printf("-1");
        map<int, int>::iterator iter = g_map.begin();
        while(iter != g_map.end())
        {
            printf(" %d", iter->first);
            g_vec.push_back(iter->first);
            ++iter;
        }
        printf("\n");
        map<PII, int>::iterator it = sale_map.begin();
        map<int, vector<PII> > ans;    // 销售点id, <商品id, 商品数量>
        while(it != sale_map.end())        
        {
            saleId = it->first.first;    //销售点id
            itemId = it->first.second;    //商品id
            ans[saleId].push_back(make_pair(itemId, it->second));
            ++it;
        }
        
        map<int, vector<PII> >::iterator it2 = ans.begin();
        while(it2 != ans.end())
        {
            printf("%d", it2->first);    
    
            int len = it2->second.size();
            int size = g_map.size();
            int j = 0;                    //这个下标 j 遍历 vector<int> g_vec;
            for(int i = 0; i < size; ++i)
            {                            //判断当前的商品id 是否需要输出
                if((j < len &&(it2->second)[j].first > g_vec[i]) || (len == j))
                {
                    printf(" 0");        //注意,没有销售该商品,输出 0
                }else{
                    printf(" %d", (it2->second)[j].second);
                    ++j;
                }
            }
            printf("\n");
            ++it2;
        }
        return 0;
    }
    
    /*
    4
    10 1 3
    20 2 5
    10 2 2
    20 2 1
    */
    
    /*
    -1 10 20
    1 3 0
    2 2 6
    */
    

    代码说明

    1.PIIpair<int, int> 的别名,用于表示 pair<销售地点 id,商品 id>

    2.sale_map 用于存储每个销售点对每个商品的销售总量。

    3.g_map 用于记录商品 id 与序号的映射关系,方便后续按顺序输出商品 id。

    4.g_vec 用于存储按升序排列的商品 id。

    5.ans 用于按销售点分组存储销售信息,方便按销售点输出表格。

    6.在输出表格时,通过遍历 g_vec 按商品 id 的顺序输出销售数量,若未销售则输出 0。

    • 1

    信息

    ID
    1381
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    2
    上传者