题意:实现一个简单的推荐系统,当用户选择一个物品时把之前用户选择的物品按照选择次数输出最大的k个。
思路:用map,set维护物品以及选择次数,set用于输出优先的k个。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
using namespace std;
const int MAX_N = 50010;
struct Data {
int cnt, v;
Data(int _cnt, int _v) : cnt(_cnt), v(_v) {}
Data() {}
bool operator < (const Data& d) const {
return cnt > d.cnt || (cnt == d.cnt && v < d.v);
}
};
int n, k, x;
set<Data> st;
map<int, int> mp;
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++) {
scanf("%d", &x);
if (st.size()) {
printf("%d:", x);
int p = 0;
for (auto it = st.begin(); it != st.end(); it++) {
printf(" %d", (it->v));
p++;
if (p >= k) break;
}
printf("\n");
}
if (mp.count(x)) {
int t = mp[x]; st.erase(Data(t, x));
t++; mp.erase(x); mp[x] = t; st.insert(Data(t, x));
} else {
mp[x] = 1; st.insert(Data(1, x));
}
}
return 0;
}