基本的知识就不再讲了,只列下用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; }