AT5274题解
思路
看到题解区大佬全部用的什么迭代器,指针,本蒟蒻很难受。
我的思路是先使用 map<string,int> nm;vector<string> v; 两个东西存放所有的名字以及每一个名字出现的次数。
输入的时候:
for(int i=0;i<n;i++){
string tmp;
cin>>tmp;
nm[tmp]++;
v.push_back(tmp);
}
注意,我们还要去重,去重前还要先排序!
sort(v.begin(),v.end());
v.erase(unique(v.begin(), v.end()), v.end());
在 C++ 中 algorithm 库中的 unique函数 就可以实现去重的功能!
紧接着,我们可以再弄一个 vector<string> ans; 用来记录所有票数最高的名字。
int mx=-1;
for(int i=0;i<v.size();i++){
mx=max(nm[v[i]],mx);
}
for(int i=0;i<v.size();i++){
if(nm[v[i]]==mx)ans.push_back(v[i]);
}
mx 表示最高的票数,第一个循环就是找到 mx,第二个循环将所有票数最高的名字存放如 ans 中。
由于题目中说:
Print all strings that are written on the most number of votes, in lexicographical order.
(按字典顺序打印以最高票数记录的所有字符串。)
我们还需要将 ans 排序后才能输出。
*小知识:C++ 中的 sort 可以自动将字符串数组排序成字典序,而 iostream 库 中的(不是algorithm 中的,algorithm 库中的不行)max 和 min 可以比较字符串大小,比较其字典序。
接下来,排序输出即可:
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<endl;
}
完整 Code
using namespace std;
int n;
int main(){
ios::sync_with_stdio(false);
map<string,int> nm;
vector<string> v;
cin>>n;
for(int i=0;i<n;i++){
string tmp;
cin>>tmp;
nm[tmp]++;
v.push_back(tmp);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(), v.end()), v.end());
vector<string> ans;
int mx=-1;
for(int i=0;i<v.size();i++){
mx=max(nm[v[i]],mx);
}
for(int i=0;i<v.size();i++){
if(nm[v[i]]==mx)ans.push_back(v[i]);
}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<endl;
}
return 0;
}

浙公网安备 33010602011771号