我的個人部落格
原題鏈結
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 ...