PAT 1129 Recommendation System

原题链接:1129 Recommendation System (25分)
关键词:set、结构体排序
参考的柳神博客:PAT 1129. Recommendation System (25) 甲级

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

题目大意: 编写一个简单的推荐系统,能够通过分析用户对各种商品的访问次数来预测用户的偏好进行推荐商品。
思路:

  1. 每个商品都有编号value、访问次数cnt两个属性,设置一个结构体node并放入set中,在结构体内重载<号,使<根据set中node的cnt排序,如果cnt相等就按照node的value排序。
    这样set里面就是按照出现次数排序好的商品node,每次输出set的前k个node的value值就可以;
  2. 因为是推荐,所以我们在接收完num的值后,应该先输出再插入set进行排序当前num,当前的这个商品不参与当前次的输出结果;当i != 0时候开始输出,因为第一次没有推荐的商品;
  3. 输出的同时记录输出过的个数tempCnt,当tempCnt < k的时就从头到尾依次输出set中的值,当tempCnt > k时就输出前k个;
  4. book[num]标记num出现的次数,每次寻找set中当前值为num和次数为book[num]的那个值,如果找到了就把他移除,(找到说明这个数已经出现过啦,cnt已经不对啦,先移除掉吧~)然后将book[num]+1,在将node(num, book[num])插入到set中,set会根据我们自定义的<的规则自动排序;

代码:

#include <iostream>
#include <set>
using namespace std;
int book[50001];    //记录出现过的次数
struct node {
    int value, cnt; //编号 出现次数
    bool operator < (const node &a) const {
        return (cnt != a.cnt) ? cnt > a.cnt : value < a.value;  //根据cnt从大大小,cnt相同的话按value值从小到大
    }
};

int main() {
    int n, k, num;
    scanf("%d%d", &n, &k);  //浏览的次数 用户最大推荐数
    set<node> s;
    for (int i = 0; i < n; i++) {
        scanf("%d", &num);
        if (i != 0) {   //第一次不输出
            printf("%d:", num);
            int tempCnt = 0;
            for(auto it = s.begin(); tempCnt < k && it != s.end(); it++) {
                printf(" %d", it->value);
                tempCnt++;
            }
            printf("\n");
        }
        auto it = s.find(node{num, book[num]});
        if (it != s.end()) s.erase(it);
        book[num]++;
        s.insert(node{num, book[num]});
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值