[プログラマー]ベストアルバム


問題の説明


各曲の種類と再生数
ベストアルバムの情報を見つけたいです.
再生回数が一番多いタイプによって.
1つのタイプでは、最大2曲まで選択できます.この2曲の順番は、数回の再生->番号の小さい順です.

アイデア


とても賑わっていました^^...終わってからsortするのが嫌なのでcustom pqを作ってくれてコードがとても汚いです.
map<タイプ、{タイプの再生数、pq<曲の再生数と番号>}>が体現しています...
かっこいい...
他の人はsortできれいに解決したようです

コード#コード#

#include <string>
#include <vector>
#include<unordered_map>
#include<queue>
#include<algorithm>
using namespace std;

struct song{
    int p, i;//identifier
    song(int pp, int ii){
        p = pp;i =ii;
    }
};

struct comp{
    bool operator()(song a, song b){
        if(a.p==b.p){
            return a.i>b.i;
        }
        return a.p<b.p;
    }
};

bool compare(pair<int,priority_queue<song, vector<song>,comp>> &a, pair<int,priority_queue<song, vector<song>,comp>> &b){
    return a.first>b.first;
}

vector<int> solution(vector<string> genres, vector<int> plays) {
    vector<int> answer;
    unordered_map<string,pair<int,priority_queue<song, vector<song>,comp>>> m;
    for(int i = 0;i<genres.size();i++){
        unordered_map<string,pair<int,priority_queue<song, vector<song>,comp>>>::iterator it =
             m.find(genres[i]);
        if(it==m.end()){
            priority_queue<song, vector<song>,comp> pq;
            pq.push(song(plays[i],i));
            m[genres[i]]={plays[i],pq};
        }
        else{
            it->second.second.push(song(plays[i],i));
            it->second.first+=plays[i];
        }
    }
    vector<pair<int,priority_queue<song, vector<song>,comp>>> v;
    for(unordered_map<string,pair<int,priority_queue<song, vector<song>,comp>>>
        ::iterator it = m.begin();it!=m.end();it++){
        v.push_back(it->second);
    }
    sort(v.begin(),v.end(),compare);
    for(int i = 0;i<v.size();i++){
        int ctr = 0;
        
        while(!v[i].second.empty()&&ctr<2){
            answer.push_back(v[i].second.top().i);
            v[i].second.pop();
            ctr++;
        }
    }
    return answer;
}