#19278. 丝路商队的账簿

丝路商队的账簿

你好!我是你的OI金牌教练。

本次我们结合初中历史“汉通西域与丝绸之路” 的知识,设计一道符合 GESP 5级 难度的题目。

GESP 5级考察的重点通常包括:结构体(struct)的应用字符串的基本处理多关键字排序(std::sort与自定义cmp函数)以及简单的数据统计与去重


第一部分:背景知识讲解

1. 张骞通西域

公元前138年和公元前119年,为了联合大月氏夹击匈奴,汉武帝两次派张骞出使西域。虽然军事目的没有完全达到,但张骞的凿空之旅开辟了中原通往西域的道路,促进了汉朝与西域各国的经济文化交流。

2. 丝绸之路 (The Silk Road)

以长安(今西安)为起点,经甘肃、新疆,到中亚、西亚,并联结地中海各国的陆上通道。

  • 输出:汉朝的丝绸、漆器、铁器等传向西方。
  • 输入:西域的良种马、香料、葡萄、石榴、核桃、乐器等传入中原。

3. 记账与统计

古代商队在长途跋涉中,需要详细记录沿途买入和卖出的货物。由于路途遥远,记录可能会非常杂乱,比如同一天买入了“葡萄”,过了几天又买入了“葡萄”。在最终向朝廷汇报或进行贸易结算时,需要将同类货物进行合并统计,并按照重要程度(数量或价值)排序


第二部分:题目内容

题目名称:丝路商队的账簿 (The Caravan's Ledger)

题目描述

张骞出使西域归来,或者后来的商队结束贸易回到长安,都会带回大量的西域特产。

商队的账房先生有一本流水账簿,上面记录了 NN 条货物入库记录。每一条记录包含两个信息:货物名称(字符串)和 数量(正整数)。

由于记录是按时间顺序流水式记入的,同一种货物可能在账簿中出现多次。例如,账簿上可能先记录了“葡萄 50 筐”,后面又记录了“葡萄 30 筐”。

为了方便呈报给汉武帝御览,你需要编写程序帮账房先生整理这份账簿,规则如下:

  1. 合并同类项:将所有名称相同的货物的数量累加,只保留一行记录。
  2. 排序输出:整理好的记录列表需要按照以下规则排序:
    • 第一关键字:按总数量大到小排序(数量越多越珍贵/重要)。
    • 第二关键字:如果总数量相同,则按货物名称的字典序小到大排序(a-z顺序)。

输入格式

第一行包含一个正整数 NN,表示流水账簿中的记录条数。

接下来 NN 行,每行包含一个字符串 SS 和一个正整数 CC,之间用一个空格隔开。

  • SS 表示货物名称(仅包含小写英文字母,长度不超过 20)。
  • CC 表示该次记录的数量。

输出格式

输出若干行,每行包含一个字符串和一个整数,表示合并并排序后的货物名称和总数量。

输入输出样例 #1

输入:

6
grape 50
horse 10
grape 30
alfalfa 100
horse 5
jade 2

输出:

alfalfa 100
grape 80
horse 15
jade 2

样例 #1 解释:

  1. 合并
    • grape: 50+30=8050 + 30 = 80
    • horse: 10+5=1510 + 5 = 15
    • alfalfa: 100100
    • jade: 22
  2. 排序
    • 按数量降序: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 解释:

  1. 合并silk=20, tea=20, jade=20, gold=5。
  2. 排序
    • silk, tea, jade 数量都是 20,gold 是 5。
    • 对于数量相同的三个,按字典序升序排:jade < silk < tea
    • 最终顺序:jade, silk, tea, gold

数据范围

对于 100%100\% 的数据:

  • 1N10001 \le N \le 1000
  • 1C10001 \le C \le 1000
  • 货物名称字符串长度 LL 满足 1L201 \le L \le 20
  • 不同的货物种类不超过 NN