map的使用题型: 1.题目给定数据,需要进行搜索的时候 2.题目给定数据,需要进行统计的时候 3.题目给定规则,自己生成数据,数据较少 住: 1.map需要注意的是可以用迭代器的first/second访问键和关键值 2.erase删除 删除迭代器位置的元素 删除键位置的元素 first,end删除first到end-1的元素,注意其都是迭代器 3.键会从小到大进行排序 1100 Mars Numbers 本题注意到,最大数字到168,可以打表将所有的数字都存储下来,最后判断首位是否是数字或者字母来分开搜索 我的代码:
string save[13]={"tret", "jan", "feb","mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
string save1[12]={"tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
int main()
{
int n;
cin>>n;
map<string,string> m_n;
map<string,int> m_s;
for(int i=0;i<13;i++)
{
string s;
s=to_string(i);
m_n[s]=save[i];
m_s[save[i]]=i;
}
for(int i=13;i<169;i++)
{
string s;
string s1;
int a=i%13;
int b=i/13;
if(a==0)
{
s=save1[b-1];
s1=to_string(i);
m_n[s1]=s;
m_s[s]=i;
}
else
{
s=save1[b-1]+" "+save[a];
s1=to_string(i);
m_n[s1]=s;
m_s[s]=i;
}
}
getchar();
string input;
for(int i=0;i<n;i++)
{
getline(cin,input);
if(input[i]>='0'&&input[i]<='9')
{
cout<<input<<endl;
cout<<m_n[input]<<endl;
}
else
{
cout<<m_s[input]<<endl;
}
}
算法笔记的代码: 他是先处理个位数,和为13倍数的数字,最后由这两个数字进行合成
int n;
cin>>n;
map<string,int> m;
string str[169];
for(int i=0;i<13;i++)
{
str[i]=save[i];
str[i*13]=save1[i];
m[save[i]]=i;
m[save1[i]]=i*13;
}
for(int i=1;i<13;i++)
{
for(int j=1;j<13;j++)
{
str[j*13+i]=save1[j]+" "+save[i];
m[save1[j]+" "+save[i]]=j*13+i;
}
}
string input;
getchar();
for(int i=0;i<n;i++)
{
getline(cin,input);
if(input[0]>='0'&&input[0]<='9')
{
cout<<str[atoi(input.c_str())]<<endl;
}
else
cout<<m[input]<<endl;
}
算法笔记的思路提供了一个合成数字的思路,计算个位,和个位为0的情况,案后两两组合起来。 1054 The Dominant Color
bool judge(char &c)
{
if(c>='0'&&c<='9')return true;
else if(c>='a'&&c<='z')return true;
else if(c>='A'&&c<='Z')
{
c=c+32;
return true;
}
return false;
}
int main()
{
string s;
getline(cin,s);
map<string,int> hash;
s.push_back('\0');
int n=s.length();
string str;
string max=";;";
hash[max]=-1;
int i=0;
while(i<n&&judge(s[i])==false)
{
i++;
}
while(i<n)
{
if(judge(s[i]))
{
str+=s[i];
i++;
continue;
}
else
{
hash[str]++;
if(hash[str]>hash[max])
{
max=str;
}
else if(hash[str]==hash[max]&&strcmp(str.c_str(),max.c_str())<0)
{
max=str;
}
str.clear();
}
while(i<n&&judge(s[i])==false)
{
i++;
}
}
cout<<max<<" "<<hash[max]<<endl;
1022 Digital Library
注意:
1.编号的格式
2.map<string,set<int>>写法,适用于一个关键字对应多个值的情况
3.while(cin>>s)
{
c=getchar();
if(c=='\n')
break;
}
这种写法是可以持续输入直到换行符为止
```cpp
void settle(map<string,set<int> > &a,string &s)
{
if(a.find(s)==a.end())
{
printf("Not Found\n");
}
else
{
for(set<int>:: iterator it=a[s].begin();it!=a[s].end();it++)
{
printf("%07d\n",*it);
}
}
}
int main()
{
int n;
cin>>n;
map<string,set<int> > title,author,key,publisher,year;
int id;
string s;
for(int i=0;i<n;i++)
{
scanf("%d",&id);
getchar();
getline(cin,s);
title[s].insert(id);
getline(cin,s);
author[s].insert(id);
cin>>s;
char c=getchar();
key[s].insert(id);
while(c!='\n')
{
cin>>s;
key[s].insert(id);
c=getchar();
}
getline(cin,s);
publisher[s].insert(id);
getline(cin,s);
year[s].insert(id);
}
int k;
cin>>k;
for(int i=0;i<k;i++)
{
int num;
scanf("%d: ",&num);
getline(cin,s);
printf("%d: %s\n",num,s.c_str());
if(num==1)
{
settle(title,s);
}
else if(num==2)
{
settle(author,s);
}
else if(num==3)
{
settle(key,s);
}
else if(num==4)
{
settle(publisher,s);
}
else
{
settle(year,s);
}
}
|