模拟题-推荐系统
题目大意:

思路:
这个题目要用到数据结构+离散化,首先想一下如何存每一类的id和分数,更容易找到指定类别和id的物品移除,因为set是有序的所以我们可以维护一个set来保存当前时间点的所有物品,按照负的分数从小到大排列,如果遇到第三种操作就遍历当前的商品,顺便判断当前类别商品的个数是否达到上限并且总选择商品数是否达到上限,此处因为类别数比较小,所以采用离散化来做,具体来说就是第c类的第id个物品会变成 c*maxid+id,由于maxid最大为1e9所以要用到long long+map来存分数的映射,具体见代码
代码:
#include <iostream> #include <queue> #include <unordered_map> #include <set> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const ll MAXID=1e9+10; unordered_map<ll,int> id_to_sc; set<pll> goods; int main(){ int m,n; cin>>m>>n; for(int i=0;i<n;i++){ int id,score; cin>>id>>score; for(int j=0;j<m;j++){ ll nid=j*MAXID+id; goods.insert({-score,nid}); id_to_sc[nid]=score; } } int ops; cin>>ops; for(int i=0;i<ops;i++){ int p; cin>>p; if(p==1){ int c,id,sc; cin>>c>>id>>sc; ll nid=c*MAXID+id; goods.insert({-sc,nid}); id_to_sc[nid]=sc; } else if(p==2){ int c,id; cin>>c>>id; ll nid=c*MAXID+id; int sc=id_to_sc[nid]; goods.erase({-sc,nid}); id_to_sc.erase(nid); } else if(p==3){ int up[55]; vector<int> res[55]; int k; cin>>k; for(int j=0;j<m;j++)cin>>up[j]; for(auto& good:goods){ int c=good.second/MAXID; int id=good.second%MAXID; if(up[c]>0){ res[c].push_back(id); up[c]--; if(--k==0)break; } } for(int j=0;j<m;j++){ if(!res[j].size())puts("-1"); else { for(int k=0;k<res[j].size();k++){ cout<<res[j][k]<<" "; } cout<<endl; } } } } }

浙公网安备 33010602011771号