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

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