在这里记一下map的遍历~
map<string,int>cnt;
std::map<string,int>::iterator it;
it=cnt.begin();
while(it!=cnt.end()){
maxx=max(maxx,it->second);
it++;
}
也可以用C++11中的auto,超级好用~
for(auto it=mp.begin();it!=mp.end;it++){
if(maxx==it->second)
cout<<it->first<<endl;
}
其中,it->first代表map的第一维元素,it->second代表第二维元素。
接下来做两个水题吧~
AtCoder ABC155 C Poll
**题意:**找出现次数最多的单词,如有多个,按照字典序从小到大输出。
**思路:**用一个map记录每个字符串的次数,遍历一遍即可~
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
map<string,int>mp;
string s[maxn];
std::map<string,int>::iterator it;
bool cmp(string a,string b){
return a<b;
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i];
mp[s[i]]++;
}
it=mp.begin();
int maxx=-1;
while(it!=mp.end()){
maxx=max(maxx,it->second);
it++;
}
//cout<<maxx<<endl;
sort(s+1,s+1+n,cmp);
for(int i=1;i<=n;i++){
if(mp[s[i]]==maxx){
cout<<s[i]<<endl;
mp[s[i]]=0;
}
}
return 0;
}
UPC 朋友
题目描述
同学们应该学会多交一些好朋友。朋友关系是相互的,A 是 B 的好朋友,则 B 也是 A 的好朋友。朋友关系是不传递的,A 是 B 的好朋友,B 是 C 的好朋友,但 A 和 C 不一定是好朋友。现在给出某小学部分同学之间的朋友关系,请编程统计朋友最多的人有多少个好朋友。
输入
输入共m+1行。
第1行是两个整数n和m,分别表示同学总人数和朋友关系对数。
第2行到第m+1行,描述了m对朋友关系。每行两个用单个空格隔开的同学姓名。
每个人的姓名仅由小写字母组成,且1≤姓名的长度≤10。
输出
输出共 1 行。
一个整数,表示朋友最多的人有多少个好朋友。
样例输入 Copy
4 3
lucy lily
jam lily
jam peter
样例输出 Copy
2
提示
4个人,3对朋友关系。lucy只有一个朋友lily;jam有两个朋友lily和peter;lily有两个朋友lucy和jam;
peter只有一个朋友jam。
所以lily和jam朋友最多,都是2个。
50%以上的测试点输入数据保证朋友关系没有重复。
100%的测试点输入数据保证2≤n≤100,1≤m≤1000,且没有自己跟自己的朋友关系。
思路: 利用map模拟就行,要注意二维string map的使用
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
map<string,map<string,int> >mp;
map<string,int>cnt;
std::map<string,int>::iterator it;
int main(){
int n,m;
string a,b;
scanf("%d%d",&n,&m);
while(m--){
cin>>a>>b;
if(!mp[a][b]){
mp[a][b]=mp[b][a]=1;
cnt[a]++;
cnt[b]++;
}
}
int maxx=-1;
it=cnt.begin();
while(it!=cnt.end()){
maxx=max(maxx,it->second);
it++;
}
printf("%d
",maxx);
return 0;
}
还有学长的一种思路是将字符串转为数组下标 思维好强啊orz 传送门
本来以为这个题是并查集,传送门~ 顺便复习一下并查集叭