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 库中的不行)maxmin 可以比较字符串大小,比较其字典序。

接下来,排序输出即可:

    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;
}
posted @ 2021-08-30 12:49  WiccldCute  阅读(116)  评论(0)    收藏  举报