CCF CSP 201909-4 推荐系统
思路:
1.将所有商品存进set里,按分数降序排序,如果分数相同,判断它们是否为同类商品,如果是,则按编号升序排序,如果不是,则按类别编号升序排序;
2.增加删除什么的直接在set里操作就行了;
3.查询时,用m个vector
存储需要输出的商品,然后从前往后扫set,如果该商品对应的类别没有满,则将它加入对应的vector,如果总数量等于k,则退出查找;
4.最后将m个vector挨个输出就好啦;
PS:不要按题意“同类商品的编号从小到大输出”,这样只有60分,不排序直接输出就能AC了~
代码:
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#include<bits/stdc++.h>
using namespace std;
#define mem(a,x) memset(a,x,sizeof(a))
#define pb(a) push_back(a)
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
struct goods{
int type,no,score;
goods(int t=0,int n=0,int s=0):type(t),no(n),score(s){}
bool operator<(const goods& a)const{
if(score==a.score){
return type==a.type?no<a.no:type<a.type;
}else return score>a.score;
}
};
const int MAX_M=55;
unordered_map<int,int> sc[MAX_M];
int ans[MAX_M];//各类商品已选取数量
int scale[MAX_M];//各类商品最多选取数量
vector<int> v[MAX_M];//输出
set<goods> st;
int main(){
IOS;
int m,n;
cin>>m>>n;
rp(i,n){//所有0~m-1类商品的第i个商品
int id,s;
cin>>id>>s;
rp(j,m){
st.insert(goods(j,id,s));
sc[j][id]=s;
}
}
int op;
cin>>op;
rp(i,op){
int no;
cin>>no;
if(no==1){
int type,no,s;
cin>>type>>no>>s;
st.insert(goods(type,no,s));
sc[type][no]=s;
}else if(no==2){
int type,no;
cin>>type>>no;
st.erase(goods(type,no,sc[type][no]));
}else{
int k;
cin>>k;
mem(ans,0),mem(scale,0);
rp(j,m) cin>>scale[j];
int total=0;
for(auto e:st){
if(ans[e.type]<scale[e.type]){
v[e.type].pb(e.no);
ans[e.type]++,total++;
if(total>=k) break;
}
}
rp(j,m){
if(v[j].size()){
// sort(v[j].begin(),v[j].end());
cout<<v[j][0];
for(int pos=1;pos<v[j].size();pos++) cout<<' '<<v[j][pos];
cout<<'\n';
v[j].clear();
}else cout<<"-1\n";
}
}
}
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具
· Vue3封装支持Base64导出的电子签名组件