【题目链接】
【题目考点】
1. 数组
2. vector
3. map
【解题思路】
将作者A~Z转为数字0~25,A对应数字0,B对应数字1,…,Z对应数字25。转换后,第0作者指A,第1作者指B,…,第25作者指Z。
解法1:使用二维数组
设二维数组ct,ct[i]
指第i作者的所有作品,是一个一维数组。ct[i][0]
为第i作者的作品数量,ct[i][j]
为第i作者的第j作品(j从1开始)。
将输入信息保存在ct数组中后,求作品数量ct[i][0]
最大的作者i,输出该作者的所有作品。
解法2:使用vector数组
设vector数组v,v[i]
指第i作者的所有作品,是一个vector对象。v[i].size()
为第i作者的作品数量,v[i][j]
为第i作者的第j作品(j从0开始)。
将输入信息保存在vector数组中后,求作品数量v[i].size()
最大的作者i,输出该作者的所有作品。
解法3:使用map
和使用vector数组的思路类似,设map<char, vector<int> > mp
,mp[i]
是个vector<int>
对象,为姓氏为i的作者所出的书。
将输入信息保存在map中后,用迭代器遍历mp,求得指向作品数量最大的(作者,作品)键值对的迭代器,输出该作者的所有作品。
【题解代码】
解法1:使用二维数组
#include<bits/stdc++.h>
using namespace std;
int ct[26][1005];
int main()
{
char s[30];
int m, b, p, mxi = 0;
scanf("%d", &m);
for(int i = 1; i <= m; ++i)
{
scanf("%d %s", &b, s);
int len = strlen(s);
for(int i = 0; i < len; ++i)
{
p = s[i]-'A';//作者编号
ct[p][++ct[p][0]] = b;//作者p的作品增加一个作品b
}
}
for(int i = 0; i < 26; ++i)
{
if(ct[i][0] > ct[mxi][0])
mxi = i;
}
printf("%c\n%d\n", 'A'+mxi, ct[mxi][0]);
for(int i = 1; i <= ct[mxi][0]; ++i)
printf("%d\n", ct[mxi][i]);
return 0;
}
解法2:使用vector数组
#include<bits/stdc++.h>
using namespace std;
vector<int> v[26];
int main()
{
string s;
int m, b, mxi = 0;
cin >> m;
for(int i = 1; i <= m; ++i)
{
cin >> b >> s;
for(int i = 0; i < s.length(); ++i)
v[s[i]-'A'].push_back(b);
}
for(int i = 0; i < 26; ++i)
if(v[i].size() > v[mxi].size())
mxi = i;
cout << char('A'+mxi) << endl << v[mxi].size() << endl;
for(int i = 0; i < v[mxi].size(); ++i)
cout << v[mxi][i] << endl;
return 0;
}
解法3:使用map
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<char, vector<int> > mp;
string s;
int m, n;
cin >> m;
while(m--)
{
cin >> n >> s;
for(int i = 0; i < s.length(); ++i)
mp[s[i]].push_back(n);
}
map<char, vector<int> >::iterator mxIt = mp.begin();
for(map<char, vector<int> >::iterator it = mp.begin(); it != mp.end(); ++it)
if(it->second.size() > mxIt->second.size())
mxIt = it;
cout << mxIt->first << endl << mxIt->second.size() << endl;
for(int num : mxIt->second)
cout << num << endl;
return 0;
}