前言
一道有关map容器的练习,利用map容器可以实现更高效的查找,以此替代常规数组型的数据结构。
一、题目描述
女孩dandelion经常去购物,她特别喜欢一家叫“memory”的商店。由于春节快到了,所有商店的价格每天都在上涨。她想知道这家商店每天的价格排名。
输入:
第1行是数字n(n<=100),代表商店的数量。
后面n行,每行有一个字符串(长度小于31,只包含小写字母和大写字母),表示商店的名称。
然后一行是数字m(1<=m<=50),表示天数。
后面有m部分,每部分有n行,每行是数字s和一个字符串p,表示商店p在这一天涨价s。
输出:
包含m行,第 i 行显示第 i 天后店铺“memory”的排名。排名的定义为如果有t个商店的价格高于“memory”,那么它的排名是t+1。
二、解析
每个商店有自己的名字和自己的涨价值,那么很容易的会联想到把涨价值与商店名关联起来。这里不再采用声明两种不同类型数组的方式(如string name[n]和int id[n])存储信息,而是用stl库的一个map容器。map容器的优势不仅仅在于可以很方便的声明这样一一对应型的数据结构。由于map底层采用二叉搜索树的结构,这使得map容器的查找时间复杂度为O(log2n)。
三、具体代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,s;
map<string,int> shop;
while(cin>>n) //遇到EOF退出循环
{
string p;
for(int i=0;i<n;i++)
{
cin>>p; //这里的s用不到
}
cin>>m; //天数
for(int i=0;i<m;i++)
{
int rank=1; //初始默认memory排名第一
for(int j=0;j<n;j++)
{
cin>>s>>p;
shop[p]+=s; //这里直接存储每个商店的累计涨价数额
}
map<string,int>::iterator it;
for(it=shop.begin();it!=shop.end();it++)
{
if(it->second>shop["memory"])
{
rank++;
}
}
cout<<rank<<endl;
}
shop.clear();
}
return 0;
}