1129 Recommendation System
Recommendation system predicts the preference that a user would give to an item. Now you are asked to program a very simple recommendation system that rates the user’s preference by the number of times that an item has been accessed by this user.
Input Specification:
Each input file contains one test case. For each test case, the first line contains two positive integers: N (≤ 50,000), the total number of queries, and K (≤ 10), the maximum number of recommendations the system must show to the user. Then given in the second line are the indices of items that the user is accessing – for the sake of simplicity, all the items are indexed from 1 to N. All the numbers in a line are separated by a space.
Output Specification:
For each case, process the queries one by one. Output the recommendations for each query in a line in the format:
query: rec[1] rec[2] ... rec[K]
where query is the item that the user is accessing, and rec[i] (i=1, … K) is the i-th item that the system recommends to the user. The first K items that have been accessed most frequently are supposed to be recommended in non-increasing order of their frequencies. If there is a tie, the items will be ordered by their indices in increasing order.
Note: there is no output for the first item since it is impossible to give any recommendation at the time. It is guaranteed to have the output for at least one query.
Sample Input:
12 3 3 5 7 5 5 3 2 1 8 3 8 12
Sample Output:
5: 3 7: 3 5 5: 3 5 7 5: 5 3 7 3: 5 3 7 2: 5 3 7 1: 5 3 2 8: 5 3 1 3: 5 3 1 8: 3 5 1 12: 3 5 8
题意
现在给出用户访问的 N 件物品,需要我们输出用户每次访问时推荐给他的 K 件物品。推荐的物品需要按照其之前访问的物品按访问次数降序排序,输出前 K 个物品,如果出现访问次数相同的物品则按照物品的编号升序输出,为了简化。所有物品的编号都是从 1~N 。
注意,用户第一次访问时是没有推荐记录的。
思路
具体思路如下:
1.除了第一次访问,每次访问都要先输出给用户推荐其最喜好的 k 件物品,并每访问一次就 cnt[id]++ 。
2.判断用户是否已经存在与推荐列表当中,如果已经存在则不需要再加入推荐列表;反之,需要加入推荐列表中。
3.对推荐列表中的物品进行排序,然后更新 k 的值,而 k 不能大于 m ,因为最多只推荐 m 个 物品,如果不够 m 个则只推荐 k 个物品。
代码
#include<bits/stdc++.h> using namespace std; const int N = 50010; int cnt[N], top_k[11]; int n, m; int main() { cin >> n >> m; int k = 0; for (int i = 0; i < n; i++) { int id; scanf("%d", &id); cnt[id]++; //增加该商品浏览次数 //第一次访问没有任何输出 if (i) { printf("%d:", id); for (int j = 0; j < k; j++) printf(" %d", top_k[j]); puts(""); } //判断当前商品是否已在推荐列表当中 bool exists = false; for (int j = 0; j < k; j++) if (top_k[j] == id) { exists = true; break; } //如果不在列表中需要加入列表,和之前推荐商品一起排序 if (!exists) top_k[k++] = id; sort(top_k, top_k + k, [](int x, int y) { if (cnt[x] != cnt[y]) return cnt[x] > cnt[y]; return x < y; }); //最多只显示m个商品,不足m个则显示k个 k = min(k, m); } return 0; }