2 条题解
-
1
map转vector 自定义排序
#include <bits/stdc++.h> using namespace std; #define int long long typedef pair<int, int> p; int n; map<int, int> cnt; // 自定义排序规则:次数降序,次数相同值升序 bool cmp(p a, p b) {//first对应值 ,second对应它出现的次数 if (a.second == b.second) return a.first < b.first;//出现次数相等 值小的在前面 return a.second > b.second;//出现次数多的在前面 } signed main() { cin >> n; while (n--) { int x; cin >> x; cnt[x]++;//计数 由于map是按值的大小排序 我们需要转换成vector 这样可以自定义排序 } vector<p> vec;//first对应值 ,second对应它出现的次数 // 存入vector for (auto &it : cnt) { vec.push_back(it); } // 自定义排序 sort(vec.begin(), vec.end(), cmp); for (auto &q : vec) { cout << q.first << " " << q.second << endl; } return 0; } -
0
#include<bits/stdc++.h> using namespace std; #define int long long /* 给定n个数 按照出现次数由大到小先输出这个数 再输出次数 1 方法1:map映射(这里是数字与次数-直接双数组)+自定义排序 2:直接pair+sort */ //1 const int N=1200; int a[N],cnt[N]; bool s[N];//去重 int n; bool cmp(int a,int b) { if(cnt[a]!=cnt[b]) return cnt[a]>cnt[b]; else return a<b; } signed main() { std::ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; cnt[a[i]]++; } //我们的第一目的是排序 a[i] 后根据cnt得到次数--排序由依据cnt 自定义牌序 sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++) { if(!s[a[i]]) cout<<a[i]<<" "<<cnt[a[i]]<<"\n"; s[a[i]]=1; } return 0; }
- 1
信息
- ID
- 534
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 173
- 已通过
- 97
- 上传者