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;
}