1 条题解
-
0
题意分析
给定一系列销售记录,包含商品 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.
PII
是pair<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
- 上传者