# 题目
F - 水果
夏天来了好开心啊,呵呵,好多好多水果
Joe 经营着一个不大的水果店。他认为生存之道就是经营最受顾客欢迎的水果。现在他想要一份水果销售情况的明细表,这样 Joe 就可以很容易掌握所有水果的销售情况了.
Input
第一行正整数 N (0<N<=10) 表示有 N 组测试数据.
每组测试数据的第一行是一个整数 M (0<M<=100), 表示工有 M 次成功的交易。其后有 M 行数据,每行表示一次交易,由水果名称 (小写字母组成,长度不超过 80), 水果产地 (小写字母组成,长度不超过 80) 和交易的水果数目 (正整数,不超过 100) 组成.
Output
对于每一组测试数据,请你输出一份排版格式正确 (请分析样本输出) 的水果销售情况明细表。这份明细表包括所有水果的产地,名称和销售数目的信息。水果先按产地分类,产地按字母顺序排列;同一产地的水果按照名称排序,名称按字母顺序排序.
两组测试数据之间有一个空行。最后一组测试数据之后没有空行.
Sample Input
1
5
apple shandong 3
pineapple guangdong 1
sugarcane guangdong 1
pineapple guangdong 3
pineapple guangdong 1
Sample Output
guangdong
|----pineapple(5)
|----sugarcane(1)
shandong
|----apple(3)
# 思路
map<(1),(2)>,1,2 不只可以是基础数据类型,还是可以自定义类型,经常用自己定义的结构体,在结构体里面还可以再定义一个 map,类似循环嵌套一样,map 里面是有序排列的,这样的话就是最外面的 map 排列优先级最高,里面也是这样,这样就可以实现排列的优先级问题,而且 map 有一个特点就是它的键值是唯一的,天然去重,这道题正好可能会出现同名的水果,用一般数组写的话里面的数据关系很复杂,而用 map 比较清晰
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=2e5+100;
struct node{
map<string,int> mp; //名字(优先级低),数量
}f[110];
int main()
{
map<string,node> mm; //地点(优先级高),第二个是一个自定义结构体,实际上是一个小map
map<string,int>::iterator mpit;
map<string,node>::iterator mmit;
int t; cin>>t;
while(t--){
mm.clear();
int n; cin>>n;
for(int i=0;i<n;i++){
string name,place;
int cnt;
cin>>name>>place>>cnt;
mm[place].mp[name]+=cnt; //这里map实现了去重操作省去了很多麻烦,直接累加就行了
}
for(mmit=mm.begin();mmit!=mm.end();mmit++){
cout<<mmit->first<<endl;
for(mpit=mmit->second.mp.begin();mpit!=mmit->second.mp.end();mpit++){
cout<<" |----"<<mpit->first<<"("<<mpit->second<<")"<<endl;
}
}
if(t!=0) cout<<endl;
}
return 0;
}