其他分享
首页 > 其他分享> > STL中map容器的应用(HDU1263水果题解)

STL中map容器的应用(HDU1263水果题解)

作者:互联网

题目链接: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:   对于每一组测试数据,请你输出一份排版格式正确(请分析样本输出)的水果销售情况明细表. 这份明细表包括所有水果的产地,名称和销售数目的信息.水果先按产地分类,产地按字母顺序排列; 同一产地的水果按照名称排序,名称按字母顺序排序. 两组测试数据之间有一个空行.最后一组测试数据之后没有空行. 样例输入: 1
5
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
来源: https://www.cnblogs.com/xiaotan-js/p/16610547.html