#19278. 丝路商队的账簿
丝路商队的账簿
你好!我是你的OI金牌教练。
本次我们结合初中历史中 “汉通西域与丝绸之路” 的知识,设计一道符合 GESP 5级 难度的题目。
GESP 5级考察的重点通常包括:结构体(struct)的应用、字符串的基本处理、多关键字排序(std::sort与自定义cmp函数)以及简单的数据统计与去重。
第一部分:背景知识讲解
1. 张骞通西域
公元前138年和公元前119年,为了联合大月氏夹击匈奴,汉武帝两次派张骞出使西域。虽然军事目的没有完全达到,但张骞的凿空之旅开辟了中原通往西域的道路,促进了汉朝与西域各国的经济文化交流。
2. 丝绸之路 (The Silk Road)
以长安(今西安)为起点,经甘肃、新疆,到中亚、西亚,并联结地中海各国的陆上通道。
- 输出:汉朝的丝绸、漆器、铁器等传向西方。
- 输入:西域的良种马、香料、葡萄、石榴、核桃、乐器等传入中原。
3. 记账与统计
古代商队在长途跋涉中,需要详细记录沿途买入和卖出的货物。由于路途遥远,记录可能会非常杂乱,比如同一天买入了“葡萄”,过了几天又买入了“葡萄”。在最终向朝廷汇报或进行贸易结算时,需要将同类货物进行合并统计,并按照重要程度(数量或价值)排序。
第二部分:题目内容
题目名称:丝路商队的账簿 (The Caravan's Ledger)
题目描述
张骞出使西域归来,或者后来的商队结束贸易回到长安,都会带回大量的西域特产。
商队的账房先生有一本流水账簿,上面记录了 条货物入库记录。每一条记录包含两个信息:货物名称(字符串)和 数量(正整数)。
由于记录是按时间顺序流水式记入的,同一种货物可能在账簿中出现多次。例如,账簿上可能先记录了“葡萄 50 筐”,后面又记录了“葡萄 30 筐”。
为了方便呈报给汉武帝御览,你需要编写程序帮账房先生整理这份账簿,规则如下:
- 合并同类项:将所有名称相同的货物的数量累加,只保留一行记录。
- 排序输出:整理好的记录列表需要按照以下规则排序:
- 第一关键字:按总数量从大到小排序(数量越多越珍贵/重要)。
- 第二关键字:如果总数量相同,则按货物名称的字典序从小到大排序(a-z顺序)。
输入格式
第一行包含一个正整数 ,表示流水账簿中的记录条数。
接下来 行,每行包含一个字符串 和一个正整数 ,之间用一个空格隔开。
- 表示货物名称(仅包含小写英文字母,长度不超过 20)。
- 表示该次记录的数量。
输出格式
输出若干行,每行包含一个字符串和一个整数,表示合并并排序后的货物名称和总数量。
输入输出样例 #1
输入:
6
grape 50
horse 10
grape 30
alfalfa 100
horse 5
jade 2
输出:
alfalfa 100
grape 80
horse 15
jade 2
样例 #1 解释:
- 合并:
grape:horse:alfalfa:jade:
- 排序:
- 按数量降序:
alfalfa(100) >grape(80) >horse(15) >jade(2)。 - 数量均不相同,直接输出。
- 按数量降序:
输入输出样例 #2
输入:
5
silk 10
tea 20
silk 10
jade 20
gold 5
输出:
jade 20
silk 20
tea 20
gold 5
样例 #2 解释:
- 合并:
silk=20,tea=20,jade=20,gold=5。 - 排序:
silk,tea,jade数量都是 20,gold是 5。- 对于数量相同的三个,按字典序升序排:
jade<silk<tea。 - 最终顺序:
jade,silk,tea,gold。
数据范围
对于 的数据:
- 货物名称字符串长度 满足 。
- 不同的货物种类不超过 。