3 条题解
-
3
好像不用写的像@那样复杂吧,只需要定义一个用来统计名字个数,在用一个结构体来定义一个,用小于运算符的重载来对排序,最后输出中的所有元素即可
#include <bits/stdc++.h> using namespace std; struct T { string x; int y; }; bool operator <(T a, T b) { if (a.y == b.y) return a.x > b.x; return a.y > b.y; } map<string, int> mp; set<T> t; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; string s; cin >> n; for (int i = 1; i <= n; i++) { cin >> s; mp[s]++; } for (auto b : mp) t.insert({b.first, b.second}); for (auto b : t) cout << b.x << " " << b.y << endl; return 0; }
-
0
首先用一个map容器,以名字为key,个数为value 存进去。这时候会自动排序,但是是按照key排序的 我们这道题想要首先按value排序,value相等 按照key排序。 想直接用sort排序是做不到的,sort只支持数组、vetctor等的排序, 所以我们可以先把map装进pair里, 然后再放入vector,自定义sort实现排序 代码: #include<bits/stdc++.h> using namespace std; map<string,int> m; int n; string x; vector<pair<string,int> > vec; map<string,int>::iterator iter; vector<pair<string,int> >::iterator curr; bool cmp(pair<string,int> a,pair<string,int> b) { if(a.second==b.second) return a.first>b.first; return a.second>b.second; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++) { cin>>x; m[x]++; } for(iter=m.begin();iter!=m.end();++iter) { vec.push_back(pair<string,int>(iter->first,iter->second)); } sort(vec.begin(),vec.end(),cmp); for(curr=vec.begin();curr!=vec.end();++curr) { cout<<curr->first<<" "<<curr->second<<endl; } return 0; }
- 1
信息
- ID
- 496
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 1
- 标签
- 递交数
- 51
- 已通过
- 43
- 上传者