题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263
题目描述:
Time Limit: 2000MS; Memory Limit: 65536K;
夏天来了~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.
现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了.
Input:
第一行正整数N(0<N<=10)表示有N组测试数据. 每组测试数据的第一行是一个整数M(0<M<=100),表示工有M次成功的交易. 其后有M行数据,每行表示一次交易, 由水果名称(小写字母组成,长度不超过80),水果产地(小写字母组成,长度不超过80)和交易的水果数目(正整数,不超过100)组成. Output: 对于每一组测试数据,请你输出一份排版格式正确(请分析样本输出)的水果销售情况明细表. 这份明细表包括所有水果的产地,名称和销售数目的信息.水果先按产地分类,产地按字母顺序排列; 同一产地的水果按照名称排序,名称按字母顺序排序. 两组测试数据之间有一个空行.最后一组测试数据之后没有空行. 样例输入: 15
apple shandong 3
pineapple guangdong 1
sugarcane guangdong 1
pineapple guangdong 3
pineapple guangdong 1 样例输出: guangdong
|----pineapple(5)
|----sugarcane(1)
shandong
|----apple(3) 分析: 此题最简单的方法就是使用二维map进行存储,按照输出顺序,可将地点存入第一维,第二维存对应的水果和数量。 输入时,直接用输入字符串表示下标,水果数量在每次输入时加到对应即可。 由于map本身会自动按关键字进行排序,本题便可省略排序的步骤。 以下是代码:
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<vector>
#define endl "\n"
using namespace std;
int n,m;
map<string,map<string,int> > fruit;//注意后面两个尖括号一定要有空格(否则容易被判为右移运算符)
int main(){
cin>>n;
while(n--){
cin>>m;
while(m--){
string name,locate;
int cnt;
cin>>name>>locate>>cnt;
fruit[locate][name]+=cnt;//map内元素初始为0,可直接++操作。
}
}
//想要进行下一层的遍历必须像如下定义并遍历:(若将迭代器写到外面则会因为未更新指针导致边界溢出)
for(map<string,map<string,int> >::iterator it=fruit.begin();it!=fruit.end();it++){//外层控制“地名”的迭代器
cout<<it->first<<endl;
for(map<string,int>::iterator it2=(it->second).begin();it2!=(it->second).end();it2++){//内层输出每个地区的信息
cout<<" |----"<<it2->first<<'('<<it2->second<<')'<<endl;
}
}
return 0;
}
最后进行一点相关补充:
C++中如果想对map进行排序,不能直接使用sort,可以先将它放入vector中再进行排序。
例如本题若偏要排序,可以这样写:
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<vector>
#define endl "\n"
using namespace std;
int n,m;
map<string,map<string,int> > fruit;
map<string,map<string,int> > sfruit;
vector<pair<string,int> > content;
bool cmp(pair<string,int> a, pair<string,int> b){//注意参数得是两个pair
return a.first<b.first;
}
bool cmp2(
int main(){
cin>>n;
while(n--){
cin>>m;
while(m--){
string f,lo;
int cnt;
cin>>f>>lo>>cnt;
fruit[lo][f]+=cnt;
}
}
for(map<string,map<string,int> >::iterator it=fruit.begin();it!=fruit.end();it++){
cout<<it->first<<endl;
//给map排序,需先将数据转到vector中。
for(map<string,int>::iterator it2=(it->second).begin();it2!=(it->second).end();it2++){
content.push_back(make_pair(it2->first,it2->second));
}
sort(content.begin(),content.end(),cmp);
for(vector<pair<string,int> >::iterator it3=content.begin();it3!=content.end();it3++){
cout<<" |----"<<it3->first<<'('<<it3->second<<')'<<endl;
}
content.clear();//及时清空数组
}
return 0;
}
标签:map,STL,题解,content,++,fruit,include,it2 From: https://www.cnblogs.com/xiaotan-js/p/16610547.html