CCF-CSP题解 201909-4 推荐系统【set+unordered_map+vector】

题目链接

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章