题目
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<pair<string,string>,int>f;
1. f.clear(); 清空map集合
if(f.find(pair<string,string>(cd,name))!=f.end())
f[pair<string,string>(cd,name)]+=num;
else f[make_pair(cd,name)]=num;
2.find函数,当数据出现时,它返回数据所在位置的迭代器,
如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器,
3.注意 f.find(pair<string,string>(cd,name) 的写法(find)
4.注意 f[pair<string,string>(cd,name)] 的写法 (key值)
5.如果集合中没有,要新建一个pair
f[make_pair(cd,name)]
for(map<pair<string,string>,int>::iterator it=f.begin();it!=f.end();it++)
6.注意迭代器的写法 尤其是 map<pair<string,string>,int>::iterator
c=it->first.first;
na=it->first.second;
numm=it->second;
7.map<int, int>的元素是key-value对,而first和second分别对应key和value,
it->first返回当前元素的关键字,it->second返回当前元素的值。
printf("%s\n",t.c_str());
8.将string用printf输出的方法
代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
int main()
{
int m,n;
cin>>n;
map<pair<string,string>,int>f;
while(n--)
{
f.clear();
int num;
string cd,name;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
cin>>name>>cd>>num;
if(f.find(pair<string,string>(cd,name))!=f.end())
f[pair<string,string>(cd,name)]+=num;
else f[make_pair(cd,name)]=num;
}
string c,na,t="***";int numm;
for(map<pair<string,string>,int>::iterator it=f.begin();it!=f.end();it++)
{
c=it->first.first;
na=it->first.second;
numm=it->second;
if(t!=c)///产地不同就输出
{
t=c;
printf("%s\n",t.c_str());///将string用printf输出的方法
}
printf(" |----%s(%d)\n",na.c_str(),numm);
}
if(n)printf("\n");
}
return 0;
}