基本的知识就不再讲了,只列下用map做的题目:
题1:POJ 1002(487-3279),这个题目烦的死,TLE了n次,只是因为我用G++提交的,好啦,要注意的就是把数组开大点,和用c语言输入,最后如果没有重复的电话号码输出:No duplicates.。
#include<iostream>
#include<cstring>
#include<map>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
char Change(char c)
{ if(c=='A'||c=='B'||c=='C') return '2';
if(c=='D'||c=='E'||c=='F') return '3';
if(c=='G'||c=='H'||c=='I') return '4';
if(c=='J'||c=='K'||c=='L') return '5';
if(c=='M'||c=='N'||c=='O') return '6';
if(c=='P'||c=='R'||c=='S') return '7';
if(c=='T'||c=='U'||c=='V') return '8';
if(c=='W'||c=='X'||c=='Y') return '9';
return c;
}
int main()
{ map<string,int> m;
int n;
char s[50];
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++)
{ gets(s);
string temp="";
int sum=0;
for(int j=0;j<strlen(s);j++)
{ if(s[j]!='-')
{ temp+=Change(s[j]);
sum++;
}
if(sum==7) break;
}
string::iterator it=temp.begin();
temp.insert(it+3,'-');
m[temp]++;
}
int flag=0;
map<string,int>::iterator it;
for(it=m.begin();it!=m.end();it++)
if((*it).second>1)
{ cout<<(*it).first<<" "<<(*it).second<<endl;
flag++;
}
if(!flag) cout<<"No duplicates. "<<endl;
return 0;
}
要注意就是map<key,value>排序是默认的是以key来排序的,不能根据value来排序,当然可以借助pair来对value进行排序。
l例NYOJ 95(众数问题),直接贴标准代码了:
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
bool mysort(const pair<int,int>& p1,const pair<int,int>& p2)
{ return p1.second<p2.second;
}
int main()
{ int n,value,Case;
cin>>Case;
while(Case--)
{ cin>>n;
map<int,int> m;
for(int i=0;i<n;i++)
{ cin>>value;
m[value]++;
}
map<int,int>::iterator it=max_element(m.begin(),m.end(),mysort);
cout<<(*it).first<<" "<<(*it).second<<endl;
}
return 0;
}
HDU涉及到map的题目有:1004(√),1075(√),1113(√)(题目意思是:XXXXXX前面是一个字典序,判断XXXXXX中的字符串能否由前面的字符串得出(可以交换顺序),并输出所有满足的字符串),直接排序后用map映射即可。贴下代码把,虽然很简单:
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
map<string,string> m;
int main()
{ string s;
while(cin>>s)
{ if(s=="XXXXXX") break;
string temp=s;
sort(s.begin(),s.end());
m[temp]=s;
}
while(cin>>s)
{ if(s=="XXXXXX") break;
sort(s.begin(),s.end());
map<string,string>::iterator it;
int flag=0;
for(it=m.begin();it!=m.end();it++)
if((*it).second==s)
{ cout<<(*it).first<<endl;
flag=1;
}
if(!flag) cout<<"NOT A VALID WORD"<<endl;
cout<<"******"<<endl;
}
return 0;
}