两道map的基本题,需要注意的东西都在注释里了。
代码如下
hdu 1004
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
int main()
{
map<string,int>m;
int n,i,Max;
string str;
while(cin>>n&&n)
{
m.clear(); //清空map,避免上次的数据对此次产生影响
for(i=0;i<n;i++)
{
cin>>str;
m[str]++; //map内int型对应的初值为0
}
Max=0;
map<string,int>::iterator ite; //声明map的迭代器
for(ite=m.begin();ite!=m.end();ite++) //遍历map
{
if(ite->second>Max)//first,second都必须用"->"的形式访问,而不用"."
{
Max=ite->second; //访问map中的前后两个元素
str=ite->first;
}
}
cout<<str<<endl;
}
return 0;
}
poj 2643
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
int main()
{
map<string,string>m1;
map<string,int>m2;
string str1,str2;
int i,j,k,n,m,Max,flag;
while(cin>>n)
{
m1.clear();m2.clear();
getchar(); //首次使用getline前注意吃掉回车
for(i=0;i<n;i++)
{
getline(cin,str1);
getline(cin,str2);
m1[str1]=str2;
}
cin>>m;
getchar();
for(i=0;i<m;i++)
{
getline(cin,str1);
//这题目有病,把满足题目中要求的这句去掉才能过
// string s=m1[str1]; //str1对应的关键字不存在则返回空字符串
// if(s.size()==0)
//continue;
// if(m1.find(str1)==m1.end()) //必须调用find方法 m1[str1]==m1.end()是错的
// continue;
m2[str1]++;
}
Max=0;flag=0;
map<string,int>::iterator ite;
for(ite=m2.begin();ite!=m2.end();ite++)
if(ite->second>Max)
{
Max=ite->second;
str1=ite->first;
}
for(ite=m2.begin();ite!=m2.end();ite++)
if(ite->first!=str1&&ite->second==Max)
{
flag=1;
break;
}
if(flag)
cout<<"tie"<<endl;
else
cout<<m1[str1]<<endl;
}
}