2 条题解

  • 1
    @ 2026-3-24 16:09:09

    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
      @ 2026-4-2 10:25:05

      #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