201909-4 推荐系统
思路:
定义一个结构体(type,number,score),重载运算符,用set进行插入和删除的操作,这样set里的数据就是有序的。再查询时先把满足的商品放进它所属类vector里,最后如果vector为空,则输出-1。
注:直接用数组存储score,提交运行错误,最后用了C++11里的unordered_map才满分,傻了,不懂为啥,也许是超时了
1.将所有商品存进set里,按分数降序排序,如果分数相同,判断它们是否为同类商品,如果是,则按编号升序排序,如果不是,则按类别编号升序排序;
2.增加删除什么的直接在set里操作就行了;
3.查询时,用m个vector存储需要输出的商品,然后从前往后扫set,如果该商品对应的类别没有满,则将它加入对应的vector,如果总数量等于k,则退出查找;
4.最后将m个vector挨个输出就好啦;
PS:不要按题意“同类商品的编号从小到大输出”,这样只有60分,不排序直接输出就能AC了
要点:
set<good> st;
vector<int> v[maxm];//记录查询
unordered_map<int,int> um[maxm];//记录某类某商品的得分
int ans[maxm];//每类当前已选
int scale[maxm];//每类最大可选
st.insert(good(type,number,score));
st.erase(good(type,numberm,um[type][number]))
for(set<good>::iterator it=st.begin();it!=st.end();it++){
if(ans[it->type]<scale[it->type]){
v[it->type].push_back(it->number);
ans[it->type]++;
tot++;
if(tot==max_select)
break;
}
}
满分代码:
#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
#include<unordered_map>
#include<memory.h>
#include<fstream>
using namespace std;
struct good{
int type;
int number;
int score;
good(int t=0,int n=0,int s=0):type(t),number(n),score(s){}
bool operator < (const good &a)const{
if(score!=a.score)
return score>a.score;
if(type!=a.type)
return type<a.type;
return number<a.number;
}
};
const int maxm=55;
const int maxn=4005;
int m,n;
set<good> st;
unordered_map<int,int> um[maxm];//记录某类某商品的得分
int ans[maxm];//每类当前已选
int scale[maxm];//每类最大可选
vector<int> v[maxm];
int main()
{
//ifstream cin("C:\\Users\\lenovo\\Desktop\\out.txt");
cin>>m>>n;
int n0,s0;
for(int i=0;i<n;i++){
cin>>n0>>s0;
for(int j=0;j<m;j++){
st.insert(good(j,n0,s0));
um[j][n0]=s0;
}
}
int op;
cin>>op;
for(int k=0;k<op;k++){
int optype;
cin>>optype;
if(optype==1){
int type,number,score;
cin>>type>>number>>score;
st.insert(good(type,number,score));
um[type][number]=score;
}
else if(optype==2){
int type,number;
cin>>type>>number;
st.erase(good(type,number,um[type][number]));
}
else if(optype==3){
memset(ans,0,sizeof(ans));
int max_select;
int tot=0;
cin>>max_select;
for(int i=0;i<m;i++)
cin>>scale[i];
for(set<good>::iterator it=st.begin();it!=st.end();it++){
if(ans[it->type]<scale[it->type]){
v[it->type].push_back(it->number);
ans[it->type]++;
tot++;
if(tot==max_select)
break;
}
}
for(int i=0;i<m;i++){
if(v[i].size()==0){
cout<<"-1"<<endl;
continue;
}
cout<<v[i][0];
for(int j=1;j<v[i].size();j++){
cout<<" "<<v[i][j];
}
v[i].clear();
cout<<endl;
}
}
}
return 0;
}