CCF認證201909 4推薦系統

2021-10-04 21:53:03 字數 1681 閱讀 6657

我的個人部落格

原題鏈結

ccf認證201909-4推薦系統

解題思路

錯誤思路

理解清楚題意再做題,這是前提啊。剛開始讀題的時候不明白下面這句話的意思。剛開始我的理解是。每個商品按分數從高到低選出ki個商品。我用vector< set> data(m);存放商品的學校。其中data[i]對應i類商品的所有小類商品的編號和分數。最後選擇的時候是從0遍歷到m-1類商品,每類商品取出不超過ki個小類商品。其實這樣的思路是錯的啊。。應該是所有的商品按分數由高到低依次排序,然後選取輸出。並要求每一類商品的個數不超過指定的閾值。

這個很挫的想法,最後只拿了十分。我實在想不明白為啥超時只給十分。原來是我的思路出錯了。要看清題目啊看清題目。血淚教訓!

正確題解

1、重新編號

由大類的商品類號和商品的編號,共同確定了乙個商品。因為再增加和刪除操作時,都需要通過類號和編號來確定需要操作的商品,為了查詢的方便,同時也為了減小時間的開銷,我們將類號和編號組合形成新的id號,以此來作為商品的唯一標識。具體的做法是id = 類號*10^9 + 編號

2、set容器實現自動排序

涉及到增加和刪除的操作,商品的內容時不斷發生變化的,每次操作後都呼叫sort進行排序顯然是有大問題的。因此在這裡就需要借助stl容器來確保有序。很顯然set是絕佳的選擇。因為是自定義的資料型別,因此需要過載運算子,規定排序的規則。也就是下面的**

bool

operator

<

(const node& s)

const

else

}

3、輔助資料結構記錄商品位置

進行刪除操作時,給定類號和編號(也就相當於id),為了找到該商品,需要遍歷容器,然後再刪除。顯然這絕對是卡時間的地方。做法是用unordered_map::iterator> um;來記錄對應商品在set中的位置。只要根據編號,就可以快速刪除指定的商品。(set容器在執行insert函式時,是有返回值的。是pair,第乙個就是迭代器的位置,第二個是bool型別,表示插入是否成功)

**

#include

using

namespace std;

struct node

bool

operator

<

(const node& s)

const

else}}

;long

long m,n,opt,tid,ts,k;

int t,type;

intmain()

).first;}}

scanf

("%lld"

,&opt)

;for

(int i=

0;i.first;

}else

if(t ==2)

else

if(t ==3)

}for

(auto

& i : ans)

if(i.

empty()

)else}}

return0;

}

CCF CSP 201909 4 推薦系統

有m 0,49 類商品,每類商品有n 0,30000 個物品.初始時,給出第i有三種操作 其中總操作個數opnum 100000,查詢個數opask 100 求每次查詢時每類商品選出的商品編號 考點 問題需求理解能力 倒不如說出題人的表達能力 stl的熟練應用 時間複雜度的分析 問題建模能力。題目未...

201909 4 csp推薦系統

這道題其實就是簡單的模擬題,難點在於如何設計表,如何提高效率。如果單純使用vector在資料量比較大的情況下會出現超時。我在做題的時候考慮過使用vector來解題,會出現超時的情況,因為插入和刪除操作會導致vector內位置移動,會有大量操作。這一題可以使用set來解題,首先set的底層實際上是 乙...

CSP 201909 4 推薦系統

題目描述 題意解讀 新增某類商品 刪除某類商品中的乙個 查詢商品 思路分析 滿分 include include include include include using namespace std typedef struct product 重定義 操作符,這決定了set的自動排序 bool ...